Tasks
Participants completed three tasks: 1.) Graph-learning, 2.)
Graph-parsing, and 3.) Graph-reconstruction.
Learning task
In the learning task, on each trial, participants saw a series of
planets with overlaid gabor patches. Participants had to press one of
two keys to indicate the ‘direction of the wind’ on the planet, as
indicated by the gabor. Wind directions were determined randomly on
every trial.
Unbeknownst to participants, the order of the planets was determined
by a random walk along a modular graph. Each planet transitioned with
25% probability to one of 4 other planets. The graph structure created
three ‘communities’ of planets, and two types of transitions:
within-community transitions, and between-community transitions.
Participants completed a total of 600 learning trials.
Parsing task
After the learning task, participants completed a ‘parsing’ task, in
which they once again saw a sequence of planets (following the same
random walk) and had to press the space bar to indicate when they
believed they had entered a different part of the galaxy.
Participants completed a total of 600 parsing trials.
Graph reconstruction
At the end of the experiment, participants saw all the planets placed
randomly on the screen. They were told to drag them around the screen to
create a map based on how they thought ‘the planets were spread out
across the universe.’ Participants could click on each planet to move
them around the screen, pressing a final button to submit their map when
they were happy with it.
Format data for SR modeling
Results
Learning
For all learning analyses, we will examine only accurate trials in
which participants responded in > 200 ms
Response time distributions

Response times by age, within block trial, block, planet lag,
transition type
| between |
20.67 |
25.48 |
| within |
10.75 |
19.9 |
Learning model with quadratic age
Plot: Log response times across planet lags


Plot: Response times across planet lags with transition type

Plot: Response times across trials with transition type

Parsing

Parsing responses by age, trial, transition type
Plot: Parsing responses by age group and transition type

Parsing responses by age, trial, transition type, planet lag
Children-only parsing responses by age, trial, transition type
Plot: Parsing responses by age, transition type, planet lag,
trial


Plot: Probability of parsing as a functon of trials around
transition types


Graph reconstruction
Filter out subjects who didn’t move the planets
Compute empirical distance matrices
Compute ground-truth geodesic distances
RSA with geodesic matrix


Is RSA above 0?
##
## One Sample t-test
##
## data: similarity_df$rsa
## t = 7.0617, df = 105, p-value = 1.852e-10
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 0.1025174 0.1825632
## sample estimates:
## mean of x
## 0.1425403
RSA scores by age
##
## Call:
## lm(formula = rsa ~ (age_z + age_squared_z), data = similarity_df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.30127 -0.15114 -0.07387 0.15610 0.59975
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.14254 0.02014 7.078 1.84e-10 ***
## age_z 0.27425 0.18296 1.499 0.137
## age_squared_z -0.26260 0.18296 -1.435 0.154
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2073 on 103 degrees of freedom
## Multiple R-squared: 0.0236, Adjusted R-squared: 0.00464
## F-statistic: 1.245 on 2 and 103 DF, p-value: 0.2923

Model-derived parameter analyses
Relations between parameters and age
Plot: Relation between β_C and age

Plot: Relation between β_R and age

Plot: Relation between γ and age

Plot: Relation between β_C and β_R

Relations between parameters and explicit knowledge
Relation between β_C and graph reconstruction
##
## Call:
## lm(formula = rsa ~ beta_c_z, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.28046 -0.15767 -0.07212 0.15079 0.56821
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.142540 0.020274 7.031 2.23e-10 ***
## beta_c_z -0.005775 0.020370 -0.283 0.777
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2087 on 104 degrees of freedom
## Multiple R-squared: 0.0007722, Adjusted R-squared: -0.008836
## F-statistic: 0.08037 on 1 and 104 DF, p-value: 0.7774
Relation between γ and graph reconstruction
##
## Call:
## lm(formula = rsa ~ gamma_z, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.27636 -0.15880 -0.07043 0.15557 0.57753
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.142540 0.020281 7.028 2.26e-10 ***
## gamma_z -0.001001 0.020378 -0.049 0.961
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2088 on 104 degrees of freedom
## Multiple R-squared: 2.32e-05, Adjusted R-squared: -0.009592
## F-statistic: 0.002412 on 1 and 104 DF, p-value: 0.9609
Relation between β_R and rsa
##
## Call:
## lm(formula = rsa ~ beta_r_z, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.28199 -0.15849 -0.07236 0.15067 0.57379
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.142540 0.020260 7.036 2.18e-10 ***
## beta_r_z -0.009689 0.020356 -0.476 0.635
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2086 on 104 degrees of freedom
## Multiple R-squared: 0.002174, Adjusted R-squared: -0.007421
## F-statistic: 0.2265 on 1 and 104 DF, p-value: 0.6351
Relation between β_C and parsing
## Mixed Model Anova Table (Type 3 tests, LRT-method)
##
## Model: parse ~ (age_z + beta_c_z) * (transition_type + planet_lag_z +
## Model: within_block_trial_z + block_z) + (transition_type + planet_lag_z +
## Model: within_block_trial_z + block_z || subject_id)
## Data: parsing_parameter_mixed_model_data
## Df full model: 20
## Effect df Chisq p.value
## 1 age_z 1 5.57 * .018
## 2 beta_c_z 1 2.24 .134
## 3 transition_type 1 24.59 *** <.001
## 4 planet_lag_z 1 52.64 *** <.001
## 5 within_block_trial_z 1 3.40 + .065
## 6 block_z 1 5.71 * .017
## 7 age_z:transition_type 1 0.24 .625
## 8 age_z:planet_lag_z 1 1.57 .210
## 9 age_z:within_block_trial_z 1 1.56 .211
## 10 age_z:block_z 1 3.86 * .049
## 11 beta_c_z:transition_type 1 0.15 .695
## 12 beta_c_z:planet_lag_z 1 1.12 .289
## 13 beta_c_z:within_block_trial_z 1 1.67 .197
## 14 beta_c_z:block_z 1 2.90 + .089
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
Relation between β_R and parsing
## Mixed Model Anova Table (Type 3 tests, LRT-method)
##
## Model: parse ~ (age_z + beta_r_z) * (transition_type + planet_lag_z +
## Model: within_block_trial_z + block_z) + (transition_type + planet_lag_z +
## Model: within_block_trial_z + block_z || subject_id)
## Data: parsing_parameter_mixed_model_data
## Df full model: 20
## Effect df Chisq p.value
## 1 age_z 1 8.37 ** .004
## 2 beta_r_z 1 0.04 .840
## 3 transition_type 1 25.40 *** <.001
## 4 planet_lag_z 1 52.98 *** <.001
## 5 within_block_trial_z 1 3.25 + .071
## 6 block_z 1 5.55 * .018
## 7 age_z:transition_type 1 10.75 ** .001
## 8 age_z:planet_lag_z 1 1.77 .183
## 9 age_z:within_block_trial_z 1 0.02 .895
## 10 age_z:block_z 1 0.61 .435
## 11 beta_r_z:transition_type 1 2.80 + .094
## 12 beta_r_z:planet_lag_z 1 1.79 .181
## 13 beta_r_z:within_block_trial_z 1 0.19 .660
## 14 beta_r_z:block_z 1 0.39 .534
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
LS0tCnRpdGxlOiAiR3JhcGggTGVhcm5pbmcgQW5hbHlzZXMiCmF1dGhvcjogIkthdGUgTnVzc2VuYmF1bSIKZGF0ZTogIjEvNi8yNiIKb3V0cHV0OiAKICAgIGh0bWxfZG9jdW1lbnQ6CiAgICAgICAgZGZfcHJpbnQ6ICdwYWdlZCcKICAgICAgICB0b2M6IHRydWUKICAgICAgICB0b2NfZmxvYXQ6CiAgICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAgICAgc2VsZl9jb250YWluZWQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBycHJvanJvb3Q6OmZpbmRfcnN0dWRpb19yb290X2ZpbGUoKSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGNhY2hlID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wYXRoID0gImZpZ3VyZXMvcmVzdWx0c19maWd1cmVzLyIpCmBgYAoKYGBge3IgbGlicmFyaWVzfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShhZmV4KQpsaWJyYXJ5KHNqUGxvdCkKbGlicmFyeShwYW5kZXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoeHRhYmxlKQpsaWJyYXJ5KGpzb25saXRlKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaWdyYXBoKQoKI2Z1bmN0aW9ucwojZGV0ZXJtaW5lIHBsb3R0aW5nIGNvbG9ycwpwbG90X2NvbG9ycyA9IGMoIiNERDhEMjkiLCAiI0UyRDIwMCIsICIjNDZBQ0M4IiwgIiNFNTg2MDEiLCAiI0I0MEYyMCIpCgojZGVmaW5lIHBsb3R0aW5nIHRoZW1lCmdyYXBoX3RoZW1lIDwtIGZ1bmN0aW9uICgpIHsKICB0aGVtZSgKICAgIHRleHQ9ZWxlbWVudF90ZXh0KGZhbWlseT0iQXJpYWwiKSwKICAgIGxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvcj0iYmxhY2siKSwKICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwKICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3I9ImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkKICApCn0KCiNhdm9pZCBzY2llbnRpZmljIG5vdGF0aW9uCm9wdGlvbnMoc2NpcGVuID0gMTAwLCBkaWdpdHMgPSA0KQpgYGAKCmBgYHtyIGRpcmVjdG9yaWVzfQoKIyBSZWFkIGluIGRhdGEKZGF0YV9kaXIgPSAnZGF0YS9zdWJfZGF0YS8nCgpgYGAKCiMgVGFza3MKClBhcnRpY2lwYW50cyBjb21wbGV0ZWQgdGhyZWUgdGFza3M6IDEuKSBHcmFwaC1sZWFybmluZywgMi4pIEdyYXBoLXBhcnNpbmcsIGFuZCAzLikgR3JhcGgtcmVjb25zdHJ1Y3Rpb24uCgojIyBMZWFybmluZyB0YXNrCkluIHRoZSBsZWFybmluZyB0YXNrLCBvbiBlYWNoIHRyaWFsLCBwYXJ0aWNpcGFudHMgc2F3IGEgc2VyaWVzIG9mIHBsYW5ldHMgd2l0aCBvdmVybGFpZCBnYWJvciBwYXRjaGVzLiBQYXJ0aWNpcGFudHMgaGFkIHRvIHByZXNzIG9uZSBvZiB0d28ga2V5cyB0byBpbmRpY2F0ZSB0aGUgJ2RpcmVjdGlvbiBvZiB0aGUgd2luZCcgb24gdGhlIHBsYW5ldCwgYXMgaW5kaWNhdGVkIGJ5IHRoZSBnYWJvci4gV2luZCBkaXJlY3Rpb25zIHdlcmUgZGV0ZXJtaW5lZCByYW5kb21seSBvbiBldmVyeSB0cmlhbC4KClVuYmVrbm93bnN0IHRvIHBhcnRpY2lwYW50cywgdGhlIG9yZGVyIG9mIHRoZSBwbGFuZXRzIHdhcyBkZXRlcm1pbmVkIGJ5IGEgcmFuZG9tIHdhbGsgYWxvbmcgYSBtb2R1bGFyIGdyYXBoLiBFYWNoIHBsYW5ldCB0cmFuc2l0aW9uZWQgd2l0aCAyNSUgcHJvYmFiaWxpdHkgdG8gb25lIG9mIDQgb3RoZXIgcGxhbmV0cy4gVGhlIGdyYXBoIHN0cnVjdHVyZSBjcmVhdGVkIHRocmVlICdjb21tdW5pdGllcycgb2YgcGxhbmV0cywgYW5kIHR3byB0eXBlcyBvZiB0cmFuc2l0aW9uczogd2l0aGluLWNvbW11bml0eSB0cmFuc2l0aW9ucywgYW5kIGJldHdlZW4tY29tbXVuaXR5IHRyYW5zaXRpb25zLiBQYXJ0aWNpcGFudHMgY29tcGxldGVkIGEgdG90YWwgb2YgNjAwIGxlYXJuaW5nIHRyaWFscy4KCgojIyBQYXJzaW5nIHRhc2sKQWZ0ZXIgdGhlIGxlYXJuaW5nIHRhc2ssIHBhcnRpY2lwYW50cyBjb21wbGV0ZWQgYSAncGFyc2luZycgdGFzaywgaW4gd2hpY2ggdGhleSBvbmNlIGFnYWluIHNhdyBhIHNlcXVlbmNlIG9mIHBsYW5ldHMgKGZvbGxvd2luZyB0aGUgc2FtZSByYW5kb20gd2FsaykgYW5kIGhhZCB0byBwcmVzcyB0aGUgc3BhY2UgYmFyIHRvIGluZGljYXRlIHdoZW4gdGhleSBiZWxpZXZlZCB0aGV5IGhhZCBlbnRlcmVkIGEgZGlmZmVyZW50IHBhcnQgb2YgdGhlIGdhbGF4eS4KClBhcnRpY2lwYW50cyBjb21wbGV0ZWQgYSB0b3RhbCBvZiA2MDAgcGFyc2luZyB0cmlhbHMuCgojIyBHcmFwaCByZWNvbnN0cnVjdGlvbgpBdCB0aGUgZW5kIG9mIHRoZSBleHBlcmltZW50LCBwYXJ0aWNpcGFudHMgc2F3IGFsbCB0aGUgcGxhbmV0cyBwbGFjZWQgcmFuZG9tbHkgb24gdGhlIHNjcmVlbi4gVGhleSB3ZXJlIHRvbGQgdG8gZHJhZyB0aGVtIGFyb3VuZCB0aGUgc2NyZWVuIHRvIGNyZWF0ZSBhIG1hcCBiYXNlZCBvbiBob3cgdGhleSB0aG91Z2h0ICd0aGUgcGxhbmV0cyB3ZXJlIHNwcmVhZCBvdXQgYWNyb3NzIHRoZSB1bml2ZXJzZS4nIFBhcnRpY2lwYW50cyBjb3VsZCBjbGljayBvbiBlYWNoIHBsYW5ldCB0byBtb3ZlIHRoZW0gYXJvdW5kIHRoZSBzY3JlZW4sIHByZXNzaW5nIGEgZmluYWwgYnV0dG9uIHRvIHN1Ym1pdCB0aGVpciBtYXAgd2hlbiB0aGV5IHdlcmUgaGFwcHkgd2l0aCBpdC4KCgpgYGB7ciBkZWZpbmUgZnVuY3Rpb25zfQojei1zY29yZQpzY2FsZV90aGlzIDwtIGZ1bmN0aW9uKHgpewogICh4IC0gbWVhbih4LCBuYS5ybT1UUlVFKSkgLyBzZCh4LCBuYS5ybT1UUlVFKQp9CgoKI3ByaW50IHJlc3VsdHMgZnJvbSBsaW5lYXIgbWl4ZWQtZWZmZWN0cyBtb2RlbHMKcHJpbnRfbW9kZWxfcmVzdWx0cyA8LSBmdW5jdGlvbihtb2RlbF9uYW1lKSB7CiAgCiAgI2dldCBGIGFuZCBwIHZhbHVlcwogIG1vZGVsX2VmZmVjdHMgPC0gYXMuZGF0YS5mcmFtZShuaWNlKG1vZGVsX25hbWUsIAogICAgICAgICAgICAgICAgICAgICAgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpKSkgJT4lCiAgZHBseXI6OnNlbGVjdChFZmZlY3QsIGRmLCBgRmAsIHAudmFsdWUpIAoKICAjZ2V0IGNvZWZmaWNpZW50cyBhbmQgc3RhbmRhcmQgZXJyb3IKICBjb2VmZmljaWVudHMgPC0gYXMuZGF0YS5mcmFtZShjb2VmKHN1bW1hcnkobW9kZWxfbmFtZSkpKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoRXN0aW1hdGUsIGBTdGQuIEVycm9yYCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oIkVmZmVjdCIpICU+JQogICAgbXV0YXRlKEVmZmVjdCA9IGdzdWIoIlswLTldIiwgIiIsIEVmZmVjdCkpICAgI3JlbW92ZSBudW1iZXJzIGZyb20gZWZmZWN0cwoKICAjbWVyZ2UgCiAgbW9kZWxfcmVzdWx0cyA8LSBmdWxsX2pvaW4oY29lZmZpY2llbnRzLCBtb2RlbF9lZmZlY3RzLCBieSA9ICJFZmZlY3QiKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoRWZmZWN0LCBFc3RpbWF0ZSwgYFN0ZC4gRXJyb3JgLCBkZiwgYEZgLCBwLnZhbHVlKSAKICAKICAjcmV0dXJuCiAgcmV0dXJuKG1vZGVsX3Jlc3VsdHMpCn0KCiNwcmludCByZXN1bHRzIGZyb20gbG9naXN0aWMgbWl4ZWQtZWZmZWN0cyBtb2RlbHMKcHJpbnRfbG9nX21vZGVsX3Jlc3VsdHMgPC0gZnVuY3Rpb24obW9kZWxfbmFtZSkgewogIAogICNnZXQgRiBhbmQgcCB2YWx1ZXMKICBtb2RlbF9lZmZlY3RzIDwtIGFzLmRhdGEuZnJhbWUobmljZShtb2RlbF9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSkpICU+JQogIGRwbHlyOjpzZWxlY3QoRWZmZWN0LCBkZiwgQ2hpc3EsIHAudmFsdWUpIAoKICAjZ2V0IGNvZWZmaWNpZW50cyBhbmQgc3RhbmRhcmQgZXJyb3IKICBjb2VmZmljaWVudHMgPC0gYXMuZGF0YS5mcmFtZShjb2VmKHN1bW1hcnkobW9kZWxfbmFtZSkpKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoRXN0aW1hdGUsIGBTdGQuIEVycm9yYCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oIkVmZmVjdCIpICU+JQogICAgbXV0YXRlKEVmZmVjdCA9IGdzdWIoIlswLTldIiwgIiIsIEVmZmVjdCkpICAgI3JlbW92ZSBudW1iZXJzIGZyb20gZWZmZWN0cwoKICAjbWVyZ2UgCiAgbW9kZWxfcmVzdWx0cyA8LSBmdWxsX2pvaW4oY29lZmZpY2llbnRzLCBtb2RlbF9lZmZlY3RzLCBieSA9ICJFZmZlY3QiKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoRWZmZWN0LCBFc3RpbWF0ZSwgYFN0ZC4gRXJyb3JgLCBkZiwgYENoaXNxYCwgcC52YWx1ZSkgCiAgCiAgI3JldHVybgogIHJldHVybihtb2RlbF9yZXN1bHRzKQp9CmBgYAoKYGBge3IgaW1wb3J0IGRhdGF9CiNyZWFkIGFuZCBjb21waWxlIGFsbCBkYXRhCmRhdGFfYWxsIDwtIGxpc3QuZmlsZXMocGF0aCA9IGRhdGFfZGlyLCAgCiAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJncmFwaF9sZWFybmluZyoiLCAKICAgICAgICAgICAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVFJVRSkgJT4lIAogIGxhcHBseShyZWFkX2NzdikgJT4lCiAgYmluZF9yb3dzCmBgYAoKCmBgYHtyIGFkZCBkZW1vZ3JhcGhpYyBkYXRhfQoKI2FkZCBzdWIgYWdlcwphZ2VfZGF0YSA8LSByZWFkX2NzdihnbHVlKCJkYXRhL3BhcnRpY2lwYW50X2FnZXMuY3N2IikpICU+JQogICAgZHBseXI6OnNlbGVjdChzdWJqZWN0X2lkID0gIlN1YmplY3QgSUQiLCBhZ2UgPSBBZ2UpCgojY29udmVydCBhZ2UgdG8gbnVtZXJpYwphZ2VfZGF0YSRhZ2UgPC0gYXMubnVtZXJpYyhhZ2VfZGF0YSRhZ2UpCgojam9pbiB3aXRoIGRhdGEKZGF0YV9hbGwgPC0gaW5uZXJfam9pbihkYXRhX2FsbCwgYWdlX2RhdGEsIGJ5ID0gInN1YmplY3RfaWQiKSAKCiNhZGQgYWdlIGluZm8KZGF0YV9hbGwgPC0gZGF0YV9hbGwgJT4lIG11dGF0ZShhZ2VfZ3JvdXAgPSBjYXNlX3doZW4oYWdlIDwgMTMgfiAiQ2hpbGRyZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA+IDEyLjk5ICYgYWdlIDwgMTggfiAiQWRvbGVzY2VudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA+IDE3Ljk5IH4gIkFkdWx0cyIpKQoKZGF0YV9hbGwkYWdlX2dyb3VwIDwtIGZhY3RvcihkYXRhX2FsbCRhZ2VfZ3JvdXAsIGxldmVscyA9IGMoIkNoaWxkcmVuIiwgIkFkb2xlc2NlbnRzIiwgIkFkdWx0cyIpKQpgYGAKCgpgYGB7ciBwcm9jZXNzIGxlYXJuaW5nIGRhdGF9CmxlYXJuaW5nX2RhdGEgPC0gZGF0YV9hbGwgJT4lCiAgZmlsdGVyKGJsb2NrICVpbiUgYygnbGVhcm5ibG9jazEnLCAnbGVhcm5ibG9jazInKSkgJT4lCiAgZHBseXI6OnNlbGVjdCh0aW1lX2VsYXBzZWQsIHN1YmplY3RfaWQsIGFnZSwgYWdlX2dyb3VwLCBibG9jaywgdHJpYWxfaW5kZXgsIHN0aW11bHVzLCBwbGFuZXQsIGNvbW11bml0eSwgcnQsIGtleV9wcmVzcywgbGVhcm5pbmdfY29ycmVjdF9yZXNwb25zZSkgJT4lCiAgICBncm91cF9ieShzdWJqZWN0X2lkLCBibG9jaykgJT4lCiAgICBtdXRhdGUocHJldl9jb21tdW5pdHkgPSBsYWcoY29tbXVuaXR5KSwKICAgICAgICAgICB3aXRoaW5fYmxvY2tfdHJpYWwgPSByYW5rKHRyaWFsX2luZGV4KSwKICAgICAgICAgICBibG9ja19udW1iZXIgPSBwYXJzZV9udW1iZXIoYXMuY2hhcmFjdGVyKGJsb2NrKSksCiAgICAgICAgICAgdHJpYWwgPSB3aXRoaW5fYmxvY2tfdHJpYWwgKyAzMDAqKGJsb2NrX251bWJlci0xKSwKICAgICAgICAgICBjb3JyZWN0ID0gaWZlbHNlKGtleV9wcmVzcyA9PSBsZWFybmluZ19jb3JyZWN0X3Jlc3BvbnNlLCAxLCAwKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgYmxvY2spICU+JQogICAgbXV0YXRlKHRyYW5zaXRpb25fdHlwZSA9IGlmZWxzZShwcmV2X2NvbW11bml0eSA9PSBjb21tdW5pdHksICJ3aXRoaW4iLCAiYmV0d2VlbiIpKSAlPiUKICB1bmdyb3VwKCkKCiNjb252ZXJ0IFJUIHRvIG51bWVyaWMKbGVhcm5pbmdfZGF0YSRydCA8LSBhcy5udW1lcmljKGxlYXJuaW5nX2RhdGEkcnQpCmBgYAoKCmBgYHtyIGNvbXB1dGUgZHVyYXRpb24gZnJvbSBzdGFydCBvZiBsYXN0IHRyaWFsIG9mIGJsb2NrIDEgdG8gc3RhcnQgb2YgYmxvY2sgMn0KCmR1cmF0aW9uX2JldHdlZW5fYmxvY2tzIDwtIGxlYXJuaW5nX2RhdGEgJT4lCiAgZmlsdGVyKHRyaWFsID09IDMwMCB8IHRyaWFsID09IDMwMSkgJT4lCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCkgJT4lCiAgbXV0YXRlKHByZXZfdHJpYWxfc3RhcnQgPSBsYWcodGltZV9lbGFwc2VkKSwKICAgICAgICAgdGltZV9iZXR3ZWVuX2Jsb2NrcyA9IHRpbWVfZWxhcHNlZCAtIHByZXZfdHJpYWxfc3RhcnQpICU+JQogIGZpbHRlcih0cmlhbCA9PSAzMDEpICU+JQogIHNlbGVjdChzdWJqZWN0X2lkLCB0aW1lX2JldHdlZW5fYmxvY2tzKQoKYGBgCgoKIyBGb3JtYXQgZGF0YSBmb3IgU1IgbW9kZWxpbmcKYGBge3IgZm9ybWF0IGZvciBTUiBtb2RlbGluZ30KI2Zvcm1hdDoKCiMgc3ViamVjdCBpZAojIGFnZQojIGJsb2NrCiMgd2l0aGluX2Jsb2NrX3RyaWFsCiMgbm9kZSAoMSAtIDE1KQojIHRhcmdldF9idXR0b24gCiMgc3RpbV9pZAojIHJ0CiMgaXNWYWxpZCAoY29ycmVjdCByZXNwb25zZSwgcnQgPiAyMDAgbXMpCiMgZXhjbHVkZV9zdWIKCiNzZWxlY3QgcmVsZXZhbnQgY29sdW1ucwptb2RlbF9kYXRhIDwtIGxlYXJuaW5nX2RhdGEgJT4lCiAgbXV0YXRlKGJsb2NrX251bSA9IHBhcnNlX251bWJlcihibG9jayksIGNvbW11bml0eV9udW0gPSBwYXJzZV9udW1iZXIoY29tbXVuaXR5KSwgcHJldl9jb21tdW5pdHlfbnVtID0gcGFyc2VfbnVtYmVyKHByZXZfY29tbXVuaXR5KSkgJT4lCiAgZHBseXI6OnNlbGVjdChzdWJqZWN0X2lkLCBhZ2UsIGJsb2NrX251bSwgd2l0aGluX2Jsb2NrX3RyaWFsLCBzdGltX2lkID0gcGxhbmV0LCBjb21tdW5pdHlfbnVtLCBwcmV2X2NvbW11bml0eV9udW0sIHRyYW5zaXRpb25fdHlwZSwgdGFyZ2V0X2J1dHRvbiA9IGxlYXJuaW5nX2NvcnJlY3RfcmVzcG9uc2UsIGtleV9wcmVzcywgY29ycmVjdCwgcnQpICU+JQogIG11dGF0ZShpc1ZhbGlkID0gaWZlbHNlKGNvcnJlY3QgPT0gMSAmIHJ0ID4gMjAwLCAxLCAwKSkgCgojaWRlbnRpZnkgZWRnZSAoZXh0ZXJpb3IpIHZzIGNlbnRyYWwgKGludGVyaW9yKSBwbGFuZXRzCmV4dGVyaW9yX3BsYW5ldHMgPC0gbW9kZWxfZGF0YSAlPiUKICBncm91cF9ieShzdWJqZWN0X2lkLCBzdGltX2lkLCBjb21tdW5pdHlfbnVtLCBwcmV2X2NvbW11bml0eV9udW0sIHRyYW5zaXRpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXplKE4gPSBuKCkpICU+JQogIGZpbHRlcih0cmFuc2l0aW9uX3R5cGUgPT0gImJldHdlZW4iKSAlPiUKICBtdXRhdGUobm9kZSA9IGNhc2Vfd2hlbihjb21tdW5pdHlfbnVtID09IDEgJiBwcmV2X2NvbW11bml0eV9udW0gPT0gMyB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaXR5X251bSA9PSAxICYgcHJldl9jb21tdW5pdHlfbnVtID09IDIgfiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW11bml0eV9udW0gPT0gMiAmIHByZXZfY29tbXVuaXR5X251bSA9PSAxIH4gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pdHlfbnVtID09IDIgJiBwcmV2X2NvbW11bml0eV9udW0gPT0gMyB+IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW11bml0eV9udW0gPT0gMyAmIHByZXZfY29tbXVuaXR5X251bSA9PSAxIH4gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaXR5X251bSA9PSAzICYgcHJldl9jb21tdW5pdHlfbnVtID09IDIgfiAxMSksCiAgICAgICAgIHBsYW5ldF90eXBlID0gImV4dGVyaW9yIikgJT4lCiAgdW5ncm91cCgpICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgc3RpbV9pZCwgbm9kZSwgcGxhbmV0X3R5cGUpCgoKaW50ZXJpb3JfcGxhbmV0c190ZW1wIDwtIG1vZGVsX2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChzdWJqZWN0X2lkLCBjb21tdW5pdHlfbnVtLCBzdGltX2lkKSAlPiUKICB1bmlxdWUoKQoKI2pvaW4KaW50ZXJpb3JfcGxhbmV0cyA8LSBmdWxsX2pvaW4oaW50ZXJpb3JfcGxhbmV0c190ZW1wLCBleHRlcmlvcl9wbGFuZXRzLCBieSA9IGMoInN1YmplY3RfaWQiLCAic3RpbV9pZCIpKSAlPiUKICBtdXRhdGUocGxhbmV0X3R5cGUgPSByZXBsYWNlX25hKHBsYW5ldF90eXBlLCAiaW50ZXJpb3IiKSkgJT4lCiAgZmlsdGVyKHBsYW5ldF90eXBlID09ICJpbnRlcmlvciIpICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaWQsIGNvbW11bml0eV9udW0pICU+JQogIG11dGF0ZShub2RlX3RlbXAgPSByYW5rKHN0aW1faWQpLAogICAgICAgICBub2RlID0gbm9kZV90ZW1wICsgKChjb21tdW5pdHlfbnVtLTEpKjUpICsgMSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgc3RpbV9pZCwgbm9kZSwgcGxhbmV0X3R5cGUpCgojY3JlYXRlIGFsbCBwbGFuZXRzIGRhdGFmcmFtZQphbGxfcGxhbmV0cyA9IHJiaW5kKGludGVyaW9yX3BsYW5ldHMsIGV4dGVyaW9yX3BsYW5ldHMpCgojcmVjb2RlIE5BIHJ0cyBhcyAwCm1vZGVsX2RhdGEgPC0gbW9kZWxfZGF0YSAlPiUKICBtdXRhdGUocnQgPSByZXBsYWNlX25hKHJ0LCAwKSkKCiNwdXQgYmFjayBpbnRvIG1vZGVsIGRhdGEKbW9kZWxfZGF0YV9ub2RlIDwtIGZ1bGxfam9pbihtb2RlbF9kYXRhLCBhbGxfcGxhbmV0cywgYnkgPSBjKCJzdWJqZWN0X2lkIiwgInN0aW1faWQiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChzdWJqZWN0X2lkLCBhZ2UsIGJsb2NrX251bSwgd2l0aGluX2Jsb2NrX3RyaWFsLCBub2RlLCB0YXJnZXRfYnV0dG9uLCBzdGltX2lkLCBydCwgaXNWYWxpZCkKYGBgCgoKIyBBcHBseSBwYXJ0aWNpcGFudCBleGNsdXNpb25zIApQYXJ0aWNpcGFudHMgd2VyZSBleGNsdWRlZCBmcm9tIHRoZSBsZWFybmluZyB0YXNrIGlmIHRoZXkgbWVldCBhbnkgb2YgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKLSBNb3JlIHRoYW4gMjAgYnJvd3NlciBpbnRlcmFjdGlvbnMKLSBMZXNzIHRoYW4gNzUlIGFjY3VyYWN5IG9uIGxlYXJuaW5nIHRyaWFscyAoZXhjbHVkaW5nIG1pc3NlZCB0cmlhbHMpCi0gTW9yZSB0aGFuIDIwJSAoMTIwKSBvZiBsZWFybmluZyB0cmlhbHMgbWlzc2VkIAotIE1vcmUgdGhhbiAyMCUgKDEyMCBvZiBsZWFybmluZyB0cmlhbHMgZmFzdCAoPCAyMDAgbXMpKQotIE1vcmUgdGhhbiAzMCBtaW51dGVzICgxODAwMDAwIG1zKSBmcm9tIHN0YXJ0IG9mIGxhc3QgdHJpYWwgb2YgYmxvY2sgMSB0byBmaXJzdCB0cmlhbCBvZiBibG9jayAyCgpgYGB7ciBjb21wdXRlIGxlYXJuaW5nIGRhdGEgZXhjbHVzaW9uc30KCiNkZXRlcm1pbmUgYmFkIHN1YmplY3RzIGJhc2VkIG9uIGJyb3dzZXIgaW50ZXJhY3Rpb25zCmJhZF9icm93c2VyX3N1YnMgPC0gZGF0YV9hbGwgJT4lCiAgZmlsdGVyKGJyb3dzZXJfaW50ZXJhY3Rpb25zID4gMjApICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgYWdlX2dyb3VwKSAlPiUKICB1bmlxdWUoKQoKI2RldGVybWluZSBleGNsdXNpb25zCmxlYXJuaW5nX2RhdGFfc3VtbWFyeSA8LSBsZWFybmluZ19kYXRhICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaWQsIGFnZV9ncm91cCkgJT4lCiAgc3VtbWFyaXplKG1pc3NlZF90cmlhbHMgPSBzdW0oa2V5X3ByZXNzID09ICJudWxsIiksCiAgICAgICAgICAgIGluYWNjdXJhdGVfdHJpYWxzID0gc3VtKGNvcnJlY3QgPT0gMCksCiAgICAgICAgICAgIGFjY3VyYXRlX3RyaWFscyA9IHN1bShjb3JyZWN0ID09IDEpLAogICAgICAgICAgICBtZWFuX2FjYyA9IGFjY3VyYXRlX3RyaWFscy8oYWNjdXJhdGVfdHJpYWxzICsgaW5hY2N1cmF0ZV90cmlhbHMgLSBtaXNzZWRfdHJpYWxzKSwKICAgICAgICAgICAgbWVhbl9ydCA9IG1lYW4ocnQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGZhc3RfcnRzID0gc3VtKHJ0IDwgMjAwLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBuX3RyaWFscyA9IG4oKSkgJT4lCiAgbXV0YXRlKGV4Y2x1ZGVfbWlzc2VkID0gaWZlbHNlKG1pc3NlZF90cmlhbHMgPiAxMjAsIDEsIDApLAogICAgICAgICBleGNsdWRlX2FjYyA9IGlmZWxzZShtZWFuX2FjYyA8IC43NSwgMSwgMCksCiAgICAgICAgIGV4Y2x1ZGUgPSBzdW0oZXhjbHVkZV9taXNzZWQgKyBleGNsdWRlX2FjYykpIAoKIwpiYWRfbWlzc2VkX3N1YnMgPC0gbGVhcm5pbmdfZGF0YV9zdW1tYXJ5ICU+JQogIGZpbHRlcihleGNsdWRlX21pc3NlZCA9PSAxKQoKYmFkX2FjY19zdWJzIDwtIGxlYXJuaW5nX2RhdGFfc3VtbWFyeSAlPiUKICBmaWx0ZXIoZXhjbHVkZV9hY2MgPT0gMSkKCmJhZF9ydF9zdWJzIDwtIGxlYXJuaW5nX2RhdGFfc3VtbWFyeSAlPiUKICBmaWx0ZXIoZmFzdF9ydHMgPiAxMjApCgppbmNvbXBsZXRlX3N1YnMgPC0gbGVhcm5pbmdfZGF0YV9zdW1tYXJ5ICU+JQogIGZpbHRlcihuX3RyaWFscyA8IDYwMCkKCmxvbmdfYnJlYWtfc3VicyA8LSBkdXJhdGlvbl9iZXR3ZWVuX2Jsb2NrcyAlPiUKICBmaWx0ZXIodGltZV9iZXR3ZWVuX2Jsb2NrcyA+IDE4MDAwMDApCmBgYAoKYGBge3IgbGFiZWwgYmFkIHBhcnRpY2lwYW50cyBpbiBtb2RlbCBkYXRhfQoKZmluYWxfbW9kZWxfZGF0YSA8LSBtb2RlbF9kYXRhX25vZGUgJT4lCiAgbXV0YXRlKGJhZF9icm93c2VyX3N1YiA9IGlmZWxzZShzdWJqZWN0X2lkICVpbiUgYmFkX2Jyb3dzZXJfc3VicyRzdWJqZWN0X2lkLCAxLCAwKSwKICAgICAgICAgYmFkX21pc3NlZF90cmlhbHMgPSBpZmVsc2Uoc3ViamVjdF9pZCAlaW4lIGJhZF9taXNzZWRfc3VicyRzdWJqZWN0X2lkLCAxLCAwKSwKICAgICAgICAgYmFkX2FjY190cmlhbHMgPSBpZmVsc2Uoc3ViamVjdF9pZCAlaW4lIGJhZF9hY2Nfc3VicyRzdWJqZWN0X2lkLCAxLCAwKSwKICAgICAgICAgZmFzdF9ydF9zdWJzID0gaWZlbHNlKHN1YmplY3RfaWQgJWluJSBiYWRfcnRfc3VicyRzdWJqZWN0X2lkLCAxLCAwKSwKICAgICAgICAgaW5jb21wbGV0ZV9zdWJzID0gaWZlbHNlKHN1YmplY3RfaWQgJWluJSBpbmNvbXBsZXRlX3N1YnMkc3ViamVjdF9pZCwgMSwgMCksCiAgICAgICAgIGxvbmdfYnJlYWtfc3VicyA9IGlmZWxzZShzdWJqZWN0X2lkICVpbiUgbG9uZ19icmVha19zdWJzJHN1YmplY3RfaWQsIDEsIDApKQoKZmluYWxfbW9kZWxfZGF0YSA8LSBmaW5hbF9tb2RlbF9kYXRhICU+JQogIG11dGF0ZShleGNsdWRlID0gaWZlbHNlKGJhZF9icm93c2VyX3N1YiA9PSAxIHwgYmFkX21pc3NlZF90cmlhbHMgPT0gMSB8IGJhZF9hY2NfdHJpYWxzID09IDEgfCBmYXN0X3J0X3N1YnMgPT0gMSB8IGluY29tcGxldGVfc3VicyA9PSAxIHwgbG9uZ19icmVha19zdWJzID09IDEsIDEsIDApKSAlPiUKICBmaWx0ZXIoZXhjbHVkZSA9PSAwKQoKI3NhdmUgY3N2CndyaXRlX2NzdihmaW5hbF9tb2RlbF9kYXRhLCAiZGF0YS9wcm9jZXNzZWQvbW9kZWxfZGF0YS5jc3YiKQpgYGAKCgpgYGB7ciBwbG90IHBhcnRpY2lwYW50IGV4Y2x1c2lvbnN9CgojYnJvd3NlciBpbnRlcmFjdGlvbnMKYnJvd3Nlcl9pbnRfcGxvdCA8LSBnZ3Bsb3QoZGF0YV9hbGwgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgYWdlX2dyb3VwLCBicm93c2VyX2ludGVyYWN0aW9ucykgJT4lIHVuaXF1ZSgpLCBhZXMoeCA9IGJyb3dzZXJfaW50ZXJhY3Rpb25zKSkgKwogIGdlb21faGlzdG9ncmFtKGZpbGwgPSBwbG90X2NvbG9yc1szXSwgY29sb3IgPSAnYmxhY2snLCBiaW5zID0gMTAwKSArCiAgeGxhYigiQnJvd3NlciBJbnRlcmFjdGlvbnMiKSArCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKwogIGdyYXBoX3RoZW1lKCkKYnJvd3Nlcl9pbnRfcGxvdCAKCiNtaXNzZWQgbGVhcm5pbmcgdHJpYWxzCm1pc3NlZF90cmlhbHNfcGxvdCA8LSBnZ3Bsb3QobGVhcm5pbmdfZGF0YV9zdW1tYXJ5LCBhZXMoeCA9IG1pc3NlZF90cmlhbHMpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IHBsb3RfY29sb3JzWzNdLCBjb2xvciA9ICdibGFjaycsIGJpbnMgPSAxMDApICsKICB4bGFiKCJNaXNzZWQgTGVhcm5pbmcgVHJpYWxzIikgKwogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHMiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTIwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArCiAgZ3JhcGhfdGhlbWUoKQptaXNzZWRfdHJpYWxzX3Bsb3QKCiNpbmFjY3VyYWN5CmxlYXJuaW5nX2FjY19wbG90IDwtIGdncGxvdChsZWFybmluZ19kYXRhX3N1bW1hcnksIGFlcyh4ID0gbWVhbl9hY2MpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IHBsb3RfY29sb3JzWzNdLCBjb2xvciA9ICdibGFjaycsIGJpbnMgPSAxMDApICsKICB4bGFiKCJMZWFybmluZyBBY2N1cmFjeSIpICsKICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC43NSwgbGluZXR5cGUgPSAnZGFzaGVkJykgKwogIGdyYXBoX3RoZW1lKCkKbGVhcm5pbmdfYWNjX3Bsb3QKCiNmYXN0IHJlYWN0aW9uIHRpbWVzCmZhc3RfcnRfcGxvdCA8LSBnZ3Bsb3QobGVhcm5pbmdfZGF0YV9zdW1tYXJ5LCBhZXMoeCA9IGZhc3RfcnRzKSkgKwogIGdlb21faGlzdG9ncmFtKGZpbGwgPSBwbG90X2NvbG9yc1szXSwgY29sb3IgPSAnYmxhY2snLCBiaW5zID0gMTAwKSArCiAgeGxhYigiRmFzdCBSVHMgKDwgMTUwIG1zKSIpICsKICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEyMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKwogIGdyYXBoX3RoZW1lKCkKZmFzdF9ydF9wbG90CgojbG9uZyBicmVhawpsb25nX2JyZWFrX3Bsb3QgPC0gZ2dwbG90KGR1cmF0aW9uX2JldHdlZW5fYmxvY2tzLCBhZXMoeCA9IHRpbWVfYmV0d2Vlbl9ibG9ja3MpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IHBsb3RfY29sb3JzWzNdLCBjb2xvciA9ICdibGFjaycsIGJpbnMgPSAxMDApICsKICB4bGFiKCJCcmVhayBCZXR3ZWVuIExlYXJuaW5nIEJsb2NrcyAoPiAzMCBtaW51dGVzKSIpICsKICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE4MDAwMDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsKICBncmFwaF90aGVtZSgpCmxvbmdfYnJlYWtfcGxvdApgYGAKCmBgYHtyIGFwcGx5IGxlYXJuaW5nIGV4Y2x1c2lvbnN9CgojY291bnQgZXhjbHVkZWQgcGFydGljaXBhbnRzIApuX2JhZF9icm93c2VyIDwtIGJhZF9icm93c2VyX3N1YnMgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCAuZHJvcCA9IEYpICU+JQogIHN1bW1hcml6ZShleGNsdWRlX2Jyb3dzZXIgPSBuKCkpCgojZXhjbHVkZSBmcm9tIGxlYXJuaW5nIGRhdGEgc3VtbWFyeQpsZWFybmluZ19zdW1tYXJ5MiA8LSBsZWFybmluZ19kYXRhX3N1bW1hcnkgJT4lCiAgZmlsdGVyKCFzdWJqZWN0X2lkICVpbiUgYmFkX2Jyb3dzZXJfc3VicyRzdWJqZWN0X2lkKQoKI25vdyBjb3VudCBtaXNzZWQgZXhjbHVzaW9ucyAoYWZ0ZXIgYWNjb3VudGluZyBmb3IgYmFkIGJyb3dzZXIgc3VicykKbl9taXNzZWRfdHJpYWxzIDwtIGxlYXJuaW5nX3N1bW1hcnkyICU+JQogIGZpbHRlcihleGNsdWRlX21pc3NlZCA9PSAxKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIC5kcm9wID0gRikgJT4lCiAgc3VtbWFyaXplKGV4Y2x1ZGVfbWlzc2VkX3RyaWFscyA9IG4oKSkKCmJhZF9taXNzZWRfc3VicyA8LSBsZWFybmluZ19kYXRhX3N1bW1hcnkgJT4lIAogIGZpbHRlcihleGNsdWRlX21pc3NlZCA9PSAxKQoKI2V4Y2x1ZGUgZnJvbSBsZWFybmluZyBkYXRhIHN1bW1hcnkKbGVhcm5pbmdfc3VtbWFyeTMgPC0gbGVhcm5pbmdfc3VtbWFyeTIgJT4lCiAgZmlsdGVyKCFzdWJqZWN0X2lkICVpbiUgYmFkX21pc3NlZF9zdWJzJHN1YmplY3RfaWQpCgojbm93IGNvdW50IGFjY3VyYWN5IGV4Y2x1c2lvbnMKbl9sb3dfYWNjIDwtIGxlYXJuaW5nX3N1bW1hcnkzICU+JQogIGZpbHRlcihleGNsdWRlX2FjYyA9PSAxKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIC5kcm9wID0gRikgJT4lCiAgc3VtbWFyaXplKGV4Y2x1ZGVfYWNjID0gbigpKQoKYmFkX2FjY19zdWJzIDwtIGxlYXJuaW5nX2RhdGFfc3VtbWFyeSAlPiUgCiAgZmlsdGVyKGV4Y2x1ZGVfYWNjID09IDEpCgojZXhjbHVkZSBmcm9tIGxlYXJuaW5nIGRhdGEgc3VtbWFyeQpsZWFybmluZ19zdW1tYXJ5NCA8LSBsZWFybmluZ19zdW1tYXJ5MyAlPiUKICBmaWx0ZXIoIXN1YmplY3RfaWQgJWluJSBiYWRfYWNjX3N1YnMkc3ViamVjdF9pZCkKCiNub3cgY291bnQgUlQgZXhjbHVzaW9ucwpuX2Zhc3RfcnQgPC0gbGVhcm5pbmdfc3VtbWFyeTQgJT4lCiAgZmlsdGVyKGZhc3RfcnRzID4gMTIwKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIC5kcm9wID0gRikgJT4lCiAgc3VtbWFyaXplKGV4Y2x1ZGVfZmFzdF9ydHMgPSBuKCkpICU+JQogIG11dGF0ZShleGNsdWRlX2Zhc3RfcnRzID0gcmVwbGFjZV9uYShleGNsdWRlX2Zhc3RfcnRzLCAwKSkgCgpiYWRfcnRfc3VicyA8LSBsZWFybmluZ19kYXRhX3N1bW1hcnkgJT4lCiAgZmlsdGVyKGZhc3RfcnRzID4gMTIwKQoKI2V4Y2x1ZGUgZnJvbSBsZWFybmluZyBkYXRhIHN1bW1hcnkKbGVhcm5pbmdfc3VtbWFyeTUgPC0gbGVhcm5pbmdfc3VtbWFyeTQgJT4lCiAgZmlsdGVyKCFzdWJqZWN0X2lkICVpbiUgYmFkX3J0X3N1YnMkc3ViamVjdF9pZCkgCgojbm93IGNvdW50IGJyZWFrIGV4Y2x1c2lvbnMKbl9sb25nX2JyZWFrIDwtIGxlYXJuaW5nX3N1bW1hcnk1ICU+JQogIGxlZnRfam9pbihkdXJhdGlvbl9iZXR3ZWVuX2Jsb2NrcywgYnkgPSBjKCJzdWJqZWN0X2lkIikpICU+JQogIGZpbHRlcih0aW1lX2JldHdlZW5fYmxvY2tzID4gMTgwMDAwMCkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCAuZHJvcCA9IEYpICU+JQogIHN1bW1hcml6ZShleGNsdWRlX2xvbmdfYnJlYWsgPSBuKCkpIAoKYmFkX2JyZWFrX3N1YnMgPC0gZHVyYXRpb25fYmV0d2Vlbl9ibG9ja3MgJT4lCiAgZmlsdGVyKHRpbWVfYmV0d2Vlbl9ibG9ja3MgPiAxODAwMDAwKQoKICAKI21ha2UgdGFibGUgb2YgZXhjbHVzaW9ucwpleGNsdXNpb25fZGF0YSA8LSBmdWxsX2pvaW4obl9iYWRfYnJvd3Nlciwgbl9taXNzZWRfdHJpYWxzLCBieSA9ICJhZ2VfZ3JvdXAiKSAlPiUKICBsZWZ0X2pvaW4oLiwgbl9sb3dfYWNjLCBieT0iYWdlX2dyb3VwIikgJT4lCiAgbGVmdF9qb2luKC4sIG5fZmFzdF9ydCwgYnk9ImFnZV9ncm91cCIpICU+JQogIGxlZnRfam9pbiguLCBuX2xvbmdfYnJlYWssIGJ5ID0gImFnZV9ncm91cCIpICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUodG90YWxfZXhjbHVkZWQgPSBleGNsdWRlX2Jyb3dzZXIgKyBleGNsdWRlX21pc3NlZF90cmlhbHMgKyBleGNsdWRlX2FjYyArIGV4Y2x1ZGVfZmFzdF9ydHMgKyBleGNsdWRlX2xvbmdfYnJlYWspCnBhbmRlcihleGNsdXNpb25fZGF0YSkKICAKI2RldGVybWluZSBvdmVyYWxsIGJhZCBsZWFybmluZyBzdWJzCmdvb2RfbGVhcm5pbmdfc3VicyA8LSBsZWFybmluZ19kYXRhX3N1bW1hcnkgJT4lCiAgZmlsdGVyKGV4Y2x1ZGUgPT0gMCkgJT4lCiAgZmlsdGVyKGZhc3RfcnRzIDwgMTIwKQoKI2ZpbHRlciBiYXNlZCBvbiBicm93c2VyIGludGVyYWN0aW9ucwpmaWx0ZXJlZF9sZWFybmluZ19kYXRhIDwtIGxlYXJuaW5nX2RhdGEgJT4lCiAgZmlsdGVyKCFzdWJqZWN0X2lkICVpbiUgYmFkX2Jyb3dzZXJfc3VicyRzdWJqZWN0X2lkKSAlPiUKICBmaWx0ZXIoc3ViamVjdF9pZCAlaW4lIGdvb2RfbGVhcm5pbmdfc3VicyRzdWJqZWN0X2lkKSAlPiUKICBmaWx0ZXIoIXN1YmplY3RfaWQgJWluJSBpbmNvbXBsZXRlX3N1YnMkc3ViamVjdF9pZCkgJT4lCiAgZmlsdGVyKCFzdWJqZWN0X2lkICVpbiUgYmFkX2JyZWFrX3N1YnMkc3ViamVjdF9pZCkKCiNkZXRlcm1pbmUgbnVtYmVyIG9mIGluY2x1ZGVkIHBhcnRpY2lwYW50cwppbmNsdWRlZF9wYXJ0aWNpcGFudHMgPC0gZmlsdGVyZWRfbGVhcm5pbmdfZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KHN1YmplY3RfaWQsIGFnZV9ncm91cCkgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwKSAlPiUKICBzdW1tYXJpemUoTiA9IG4oKSkKcGFuZGVyKGluY2x1ZGVkX3BhcnRpY2lwYW50cykKYGBgCgoKIyBSZXN1bHRzCgojIyBMZWFybmluZwpGb3IgYWxsIGxlYXJuaW5nIGFuYWx5c2VzLCB3ZSB3aWxsIGV4YW1pbmUgb25seSBhY2N1cmF0ZSB0cmlhbHMgaW4gd2hpY2ggcGFydGljaXBhbnRzIHJlc3BvbmRlZCBpbiA+IDIwMCBtcwoKIyMjIFJlc3BvbnNlIHRpbWUgZGlzdHJpYnV0aW9ucwoKYGBge3IgcGxvdCBydCBjdXRvZmZ9CmdncGxvdChmaWx0ZXJlZF9sZWFybmluZ19kYXRhICU+JSBmaWx0ZXIoY29ycmVjdCA9PSBUKSwgYWVzKHggPSBydCkpICsKICAgIGZhY2V0X3dyYXAofmFnZV9ncm91cCkgKwogICAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAiYmxhY2siLCBmaWxsID0gcGxvdF9jb2xvcnNbM10sIGJpbnMgPSA0MCkgKwogICAgeGxhYigiUmVhY3Rpb24gVGltZSAobXMpIG9uIENvcnJlY3QgVHJpYWxzIikgKwogICAgeWxhYigiQ291bnQiKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdyYXBoX3RoZW1lKCkKCmBgYAoKCiMjIyBSZXNwb25zZSB0aW1lcyBieSBhZ2UsIHdpdGhpbiBibG9jayB0cmlhbCwgYmxvY2ssIHBsYW5ldCBsYWcsIHRyYW5zaXRpb24gdHlwZQpgYGB7ciBwbGFuZXQgbGFnIGRhdGEgcHJvY2Vzc2luZ30KcGxhbmV0X2VuY291bnRlcmVkX2RhdGEgPC0gZmlsdGVyZWRfbGVhcm5pbmdfZGF0YSAlPiUKICBncm91cF9ieShzdWJqZWN0X2lkKSAlPiUKICBncm91cF9ieShwbGFuZXQpICU+JQogIG11dGF0ZShwbGFuZXRfbGFnID0gd2l0aGluX2Jsb2NrX3RyaWFsIC0gbGFnKHdpdGhpbl9ibG9ja190cmlhbCwgZGVmYXVsdCA9IGZpcnN0KHdpdGhpbl9ibG9ja190cmlhbCkpIC0gMSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRwbHlyOjpzZWxlY3QocnQsIHRyYW5zaXRpb25fdHlwZSwgYmxvY2ssIHdpdGhpbl9ibG9ja190cmlhbCx0cmlhbCwgc3ViamVjdF9pZCwgYWdlLCBwbGFuZXQsIGxlYXJuaW5nX2NvcnJlY3RfcmVzcG9uc2UsIHBsYW5ldF9sYWcsIGNvcnJlY3QpICU+JQogIGZpbHRlcihwbGFuZXRfbGFnID4gMCkgCgojc2FuaXR5IGNoZWNrIC0gaXMgd2l0aGluIDwgYmV0d2Vlbj8KcGxhbmV0X2VuY291bnRlcmVkX21lYW5zIDwtIHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhICU+JQogIGdyb3VwX2J5KHRyYW5zaXRpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fbGFnID0gbWVhbihwbGFuZXRfbGFnKSwKICAgICAgICAgICAgc2RfbGFnID0gc2QocGxhbmV0X2xhZykpCgpwYW5kZXIocGxhbmV0X2VuY291bnRlcmVkX21lYW5zKQoKI2ZpbHRlciBwbGFuZXQgZW5jb3VudGVyZWQgZGF0YQpwbGFuZXRfZW5jb3VudGVyZWRfZGF0YSA8LSBwbGFuZXRfZW5jb3VudGVyZWRfZGF0YSAlPiUKICBmaWx0ZXIocGxhbmV0X2xhZyA+IDApICU+JQogIGZpbHRlcihjb3JyZWN0ID09IFQpICU+JSAKICBmaWx0ZXIocnQgPiAyMDApICU+JQogIGRyb3BfbmEoKQpgYGAKCmBgYHtyIGxlYXJuaW5nIHJ0IG1vZGVsfQoKI3RyYW5zZm9ybSB2YXJpYWJsZXMKcGxhbmV0X2VuY291bnRlcmVkX2RhdGEkbG9nX3J0IDwtIGxvZyhwbGFuZXRfZW5jb3VudGVyZWRfZGF0YSRydCkKcGxhbmV0X2VuY291bnRlcmVkX2RhdGEkYWdlX3ogPC0gc2NhbGVfdGhpcyhwbGFuZXRfZW5jb3VudGVyZWRfZGF0YSRhZ2UpCnBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhJHdpdGhpbl9ibG9ja190cmlhbF96IDwtIHNjYWxlX3RoaXMocGxhbmV0X2VuY291bnRlcmVkX2RhdGEkd2l0aGluX2Jsb2NrX3RyaWFsKQpwbGFuZXRfZW5jb3VudGVyZWRfZGF0YSRibG9ja196IDwtIHNjYWxlX3RoaXMocGFyc2VfbnVtYmVyKHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhJGJsb2NrKSkKcGxhbmV0X2VuY291bnRlcmVkX2RhdGEkcGxhbmV0X2xhZ196IDwtIHNjYWxlX3RoaXMocGxhbmV0X2VuY291bnRlcmVkX2RhdGEkcGxhbmV0X2xhZykKcGxhbmV0X2VuY291bnRlcmVkX2RhdGEkdHJhbnNpdGlvbl90eXBlIDwtIGZhY3RvcihwbGFuZXRfZW5jb3VudGVyZWRfZGF0YSR0cmFuc2l0aW9uX3R5cGUpCnBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhJGxlYXJuaW5nX2NvcnJlY3RfcmVzcG9uc2UgPC0gZmFjdG9yKHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhJGxlYXJuaW5nX2NvcnJlY3RfcmVzcG9uc2UpCnBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhJHBsYW5ldCA8LSBmYWN0b3IocGxhbmV0X2VuY291bnRlcmVkX2RhdGEkcGxhbmV0KQoKI3J1biBSVCBhbmFseXNpcwpydF9ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZSA8LSBtaXhlZChsb2dfcnQgfiBhZ2VfeiAqIGJsb2NrX3ogKiB3aXRoaW5fYmxvY2tfdHJpYWxfeiAqIHBsYW5ldF9sYWdfeiAqIHRyYW5zaXRpb25fdHlwZSArIGxlYXJuaW5nX2NvcnJlY3RfcmVzcG9uc2UgKyAocGxhbmV0X2xhZ196ICsgd2l0aGluX2Jsb2NrX3RyaWFsX3ogKyB0cmFuc2l0aW9uX3R5cGUgKyBsZWFybmluZ19jb3JyZWN0X3Jlc3BvbnNlICsgYmxvY2tfeiB8fCBzdWJqZWN0X2lkKSArICgxfCBwbGFuZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3JlID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVyID0gImJvYnlxYSIpKQoKcHJpbnRfbW9kZWxfcmVzdWx0cyhydF9ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZSkKCiNub3RlOiBpcyBzaW5ndWxhciB3aXRoIGludGVyYWN0aW9ucyBpbiBSRSwgcHJ1bmVkCgpgYGAKCiMjIyBMZWFybmluZyBtb2RlbCB3aXRoIHF1YWRyYXRpYyBhZ2UKYGBge3IgbGVhcm5pbmcgcnQgbW9kZWwgd2l0aCBxdWFkcmF0aWMgYWdlfQoKI3RyYW5zZm9ybSB2YXJpYWJsZXMKcGxhbmV0X2VuY291bnRlcmVkX2RhdGEkYWdlX3NxdWFyZWRfeiA8LSBzY2FsZV90aGlzKHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhJGFnZV4yKQoKI3J1biBSVCBhbmFseXNpcwpydF9ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZV9hZ2Vfc3F1YXJlZCA8LSBtaXhlZChsb2dfcnQgfiAoYWdlX3ogKyBhZ2Vfc3F1YXJlZF96KSAqIGJsb2NrX3ogKiB3aXRoaW5fYmxvY2tfdHJpYWxfeiAqIHBsYW5ldF9sYWdfeiAqIHRyYW5zaXRpb25fdHlwZSArIGxlYXJuaW5nX2NvcnJlY3RfcmVzcG9uc2UgKyAocGxhbmV0X2xhZ196ICsgd2l0aGluX2Jsb2NrX3RyaWFsX3ogKyB0cmFuc2l0aW9uX3R5cGUgKyBsZWFybmluZ19jb3JyZWN0X3Jlc3BvbnNlICsgYmxvY2tfeiB8fCBzdWJqZWN0X2lkKSArICgxfCBwbGFuZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3JlID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVyID0gImJvYnlxYSIpKQoKcHJpbnRfbW9kZWxfcmVzdWx0cyhydF9ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZV9hZ2Vfc3F1YXJlZCkKCiNjb21wYXJlIG1vZGVscwphbm92YShydF9ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZSwgcnRfYnlfcGxhbmV0X2VuY291bnRlcl90cmFuc2l0aW9uX3R5cGVfYWdlX3NxdWFyZWQpCgojcXVhZHJhdGljIG1vZGVsIGRvZXMgbm90IGltcHJvdmUgZml0CgpgYGAKCgojIyMjIFBsb3Q6IExvZyByZXNwb25zZSB0aW1lcyBhY3Jvc3MgcGxhbmV0IGxhZ3MKYGBge3IgcGxvdCBwbGFuZXQgbGFnIFJUIGVmZmVjdHMsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSA3fQoKI2NvbXB1dGUgc3ViamVjdCBtZWFucwpzdWJfbWVhbl9ydHMgPC0gcGxhbmV0X2VuY291bnRlcmVkX2RhdGEgJT4lCiAgICBncm91cF9ieShwbGFuZXRfbGFnLCBzdWJqZWN0X2lkLCB0cmFuc2l0aW9uX3R5cGUpICU+JQogICAgc3VtbWFyaXplKG1lYW5fc3ViX3J0ID0gbWVhbihsb2cocnQpKSwKICAgICAgICAgICAgICBzZF9zdWJfcnQgPSBzZChsb2cocnQpKSwKICAgICAgICAgICAgICBOID0gbigpKSAlPiUKICBmaWx0ZXIocGxhbmV0X2xhZyA8IDEwMCkKCmdyb3VwX21lYW5fcnRzIDwtIHN1Yl9tZWFuX3J0cyAlPiUKICAgIGdyb3VwX2J5KHBsYW5ldF9sYWcsIHRyYW5zaXRpb25fdHlwZSkgJT4lCiAgICBzdW1tYXJpemUobWVhbl9ydCA9IG1lYW4obWVhbl9zdWJfcnQpLAogICAgICAgICAgICAgIHNlX3J0ID0gc2QobWVhbl9zdWJfcnQvc3FydChuKCkpKSwKICAgICAgICAgICAgICBtZWFuX251bV90cmlhbHMgPSBtZWFuKE4pCiAgICAgICAgICAgICAgKQoKcGxhbmV0X3JlY2VuY3lfcnRfcGxvdCA8LSBnZ3Bsb3QoZ3JvdXBfbWVhbl9ydHMsIGFlcyh4ID0gIHBsYW5ldF9sYWcsIHkgPSBtZWFuX3J0LCBjb2xvciA9IHRyYW5zaXRpb25fdHlwZSwgZmlsbCA9IHRyYW5zaXRpb25fdHlwZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgCiAgeWxhYigiTWVhbiBMb2cgUmVzcG9uc2UgVGltZSAobXMpIikgKwogIHhsYWIoIlBsYW5ldCBMYWciKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKHBsb3RfY29sb3JzWzFdLCBwbG90X2NvbG9yc1szXSksIG5hbWUgPSAiVHJhbnNpdGlvbiBUeXBlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMocGxvdF9jb2xvcnNbMV0sIHBsb3RfY29sb3JzWzNdKSwgbmFtZSA9ICJUcmFuc2l0aW9uIFR5cGUiKSArCiAgZ3JhcGhfdGhlbWUoKQpwbGFuZXRfcmVjZW5jeV9ydF9wbG90CmBgYAoKCmBgYHtyIHBsb3QgdHJhbnNpdGlvbiB0eXBlIGVmZmVjdHMsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSA1fQoKI2NvbXB1dGUgc3ViamVjdCBtZWFucwpzdWJfbWVhbl9ydHMgPC0gcGxhbmV0X2VuY291bnRlcmVkX2RhdGEgJT4lCiAgICBncm91cF9ieSh0cmFuc2l0aW9uX3R5cGUsIHdpdGhpbl9ibG9ja190cmlhbCwgc3ViamVjdF9pZCkgJT4lCiAgICBzdW1tYXJpemUobWVhbl9zdWJfcnQgPSBtZWFuKHJ0KSwKICAgICAgICAgICAgICBzZF9zdWJfcnQgPSBzZChydCksCiAgICAgICAgICAgICAgTiA9IG4oKSkgCgpncm91cF9tZWFuX3J0cyA8LSBzdWJfbWVhbl9ydHMgJT4lCiAgICBncm91cF9ieSh0cmFuc2l0aW9uX3R5cGUsIHdpdGhpbl9ibG9ja190cmlhbCkgJT4lCiAgICBzdW1tYXJpemUobWVhbl9ydCA9IG1lYW4obWVhbl9zdWJfcnQpLAogICAgICAgICAgICAgIHNlX3J0ID0gc2QobWVhbl9zdWJfcnQvc3FydChuKCkpKQogICAgICAgICAgICAgICkKCnRyaWFsX3RyYW5zaXRpb25fcnRfcGxvdCA8LSBnZ3Bsb3QoZ3JvdXBfbWVhbl9ydHMsIGFlcyh4ID0gIHdpdGhpbl9ibG9ja190cmlhbCwgeSA9IG1lYW5fcnQsIGNvbG9yID0gdHJhbnNpdGlvbl90eXBlLCBmaWxsID0gdHJhbnNpdGlvbl90eXBlKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgCiAgeWxhYigiTWVhbiBSZXNwb25zZSBUaW1lIChtcykiKSArCiAgeGxhYigiVHJpYWwiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKHBsb3RfY29sb3JzWzFdLCBwbG90X2NvbG9yc1szXSksIG5hbWUgPSAiVHJhbnNpdGlvbiBUeXBlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMocGxvdF9jb2xvcnNbMV0sIHBsb3RfY29sb3JzWzNdKSwgbmFtZSA9ICJUcmFuc2l0aW9uIFR5cGUiKSArCiAgZ3JhcGhfdGhlbWUoKQp0cmlhbF90cmFuc2l0aW9uX3J0X3Bsb3QKYGBgCgojIyMjIFBsb3Q6IFJlc3BvbnNlIHRpbWVzIGFjcm9zcyBwbGFuZXQgbGFncyB3aXRoIHRyYW5zaXRpb24gdHlwZQpgYGB7ciBwbG90IHBsYW5ldCBsYWcgeCB0cmFuc2l0aW9uIHR5cGUgUlQgZWZmZWN0cywgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDR9CgojcmVydW4gbW9kZWwgdG8gZXh0cmFjdCBsbWVyIG9iamVjdCBmb3IgcGxvdHRpbmcKcnRfYnlfcGxhbmV0X2VuY291bnRlcl90cmFuc2l0aW9uX3R5cGUubG1lciA8LSBtaXhlZChsb2dfcnQgfiBhZ2VfeiAqIHdpdGhpbl9ibG9ja190cmlhbF96ICpibG9ja196ICogcGxhbmV0X2xhZ196ICogdHJhbnNpdGlvbl90eXBlICsgbGVhcm5pbmdfY29ycmVjdF9yZXNwb25zZSArIChwbGFuZXRfbGFnX3ogKyB3aXRoaW5fYmxvY2tfdHJpYWxfeiArIGJsb2NrX3ogKyB0cmFuc2l0aW9uX3R5cGUgKyBsZWFybmluZ19jb3JyZWN0X3Jlc3BvbnNlIHx8IHN1YmplY3RfaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBsYW5ldF9lbmNvdW50ZXJlZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3JlID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVyID0gImJvYnlxYSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuID0gIm1lck1vZCIpCgpwbG90X21vZGVsKHJ0X2J5X3BsYW5ldF9lbmNvdW50ZXJfdHJhbnNpdGlvbl90eXBlLmxtZXIsIAogICAgICAgICAgIHR5cGUgPSAicHJlZCIsIAogICAgICAgICAgIGxpbmUuc2l6ZSA9IDEuNSwKICAgICAgICAgICB0ZXJtcyA9IGMoInBsYW5ldF9sYWdfeiIsICJ0cmFuc2l0aW9uX3R5cGUiKSwKICAgICAgICAgICBjb2xvcnMgPSBjKHBsb3RfY29sb3JzWzFdLCBwbG90X2NvbG9yc1szXSksCiAgICAgICAgICAgbGVnZW5kLnRpdGxlPSJUcmFuc2l0aW9uIFR5cGUiKSArCiAgeGxhYigiUGxhbmV0IExhZyAoei1zY29yZWQpIikgKwogIHlsYWIoIlByZWRpY3RlZCBMb2cgUmVzcG9uc2UgVGltZSAobXMpIikgKwogIGdndGl0bGUoIiIpICsgCiAgZ3JhcGhfdGhlbWUoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkKYGBgCgojIyMjIFBsb3Q6IFJlc3BvbnNlIHRpbWVzIGFjcm9zcyB0cmlhbHMgd2l0aCB0cmFuc2l0aW9uIHR5cGUKYGBge3IgcGxvdCBwbGFuZXQgbGFnIHggdHJpYWwgUlQgZWZmZWN0cywgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDR9CgpwbG90X21vZGVsKHJ0X2J5X3BsYW5ldF9lbmNvdW50ZXJfdHJhbnNpdGlvbl90eXBlLmxtZXIsIAogICAgICAgICAgIHR5cGUgPSAicHJlZCIsIAogICAgICAgICAgIGxpbmUuc2l6ZSA9IDEuNSwKICAgICAgICAgICB0ZXJtcyA9IGMoIndpdGhpbl9ibG9ja190cmlhbF96IiwgInRyYW5zaXRpb25fdHlwZSIpLCAKICAgICAgICAgICBjb2xvcnMgPSBjKHBsb3RfY29sb3JzWzFdLCBwbG90X2NvbG9yc1szXSksCiAgICAgICAgICAgbGVnZW5kLnRpdGxlPSJUcmFuc2l0aW9uIFR5cGUiKSArCiAgeGxhYigiV2l0aGluLUJsb2NrIFRyaWFsICh6LXNjb3JlZCkiKSArCiAgeWxhYigiUHJlZGljdGVkIExvZyBSZXNwb25zZSBUaW1lIChtcykiKSArCiAgZ2d0aXRsZSgiIikgKyAKICBncmFwaF90aGVtZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQpgYGAKCiMjIFBhcnNpbmcKCmBgYHtyIHBhcnNpbmcgZGF0YSBwcm9jZXNzaW5nfQoKI2dldCBwYXJzaW5nIGRhdGEKcGFyc2luZ19kYXRhIDwtIGRhdGFfYWxsICU+JQogICAgZmlsdGVyKGJsb2NrICVpbiUgYygicGFyc2VibG9jazEiLCAicGFyc2VibG9jazIiLCAicGFyc2VibG9jazMiLCAicGFyc2VibG9jazQiKSkKCiNkZXRlcm1pbmUgc3ViamVjdHMgaW5jbHVkZWQgaW4gbGVhcm5pbmcKbGVhcm5pbmdfc3VicyA8LSBmaWx0ZXJlZF9sZWFybmluZ19kYXRhICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCkgJT4lCiAgdW5pcXVlKCkKCiNkZXRlcm1pbmUgY29tbXVuaXRpZXMgZnJvbSBsZWFybmluZwpjb21tdW5pdGllcyA8LSBmaWx0ZXJlZF9sZWFybmluZ19kYXRhICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgcGxhbmV0LCBjb21tdW5pdHkpICU+JQogIHVuaXF1ZSgpCgojZmlsdGVyIGJhc2VkIG9uIGxlYXJuaW5nCnBhcnNpbmdfZGF0YV9maWx0ZXJlZCA8LSBwYXJzaW5nX2RhdGEgJT4lCiAgZmlsdGVyKHN1YmplY3RfaWQgJWluJSBsZWFybmluZ19zdWJzJHN1YmplY3RfaWQpICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgYWdlLCBhZ2VfZ3JvdXAsIHRyaWFsX2luZGV4LCBibG9jaywgcnQsIHN0aW11bHVzLCBwYXJzZSkgJT4lCiAgbXV0YXRlKHBsYW5ldCA9IGV4dHJhY3RfbnVtZXJpYyhzdGltdWx1cykpIAoKI2xhYmVsIGNvbW11bml0aWVzCnBhcnNpbmdfZGF0YV9maWx0ZXJlZCA8LSBmdWxsX2pvaW4ocGFyc2luZ19kYXRhX2ZpbHRlcmVkLCBjb21tdW5pdGllcywgYnkgPSBjKCdzdWJqZWN0X2lkJywgJ3BsYW5ldCcpKQoKI2RldGVybWluZSB0cmFuc2l0aW9uIHR5cGUKcGFyc2luZ19kYXRhX2ZpbHRlcmVkIDwtIHBhcnNpbmdfZGF0YV9maWx0ZXJlZCAlPiUKICAgIG11dGF0ZShwcmV2X2NvbW11bml0eSA9IGxhZyhjb21tdW5pdHkpLAogICAgICAgICAgIGJsb2NrX251bWJlciA9IHBhcnNlX251bWJlcihhcy5jaGFyYWN0ZXIoYmxvY2spKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBtdXRhdGUodHJhbnNpdGlvbl90eXBlID0gaWZlbHNlKHByZXZfY29tbXVuaXR5ID09IGNvbW11bml0eSwgIndpdGhpbiIsICJiZXR3ZWVuIikpCgojZGV0ZXJtaW5lIHRyaWFsIG51bWJlcgpwYXJzaW5nX2RhdGFfZmlsdGVyZWQgPC0gcGFyc2luZ19kYXRhX2ZpbHRlcmVkICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JQogIG11dGF0ZSh0cmlhbCA9IHJhbmsodHJpYWxfaW5kZXgpKSAlPiUKICB1bmdyb3VwKCkKCgojZmlsdGVyIHRyaWFscyAtIGV4Y2x1ZGUgdHJpYWxzIHdpdGggcGFyc2luZyByZXNwb25zZXMgPCAyMDAgbXMgJiBmaXJzdCB0cmlhbCB3aXRoaW4gZWFjaCBibG9jawpwYXJzaW5nX2RhdGFfZmlsdGVyZWQkcnQgPC0gYXMubnVtZXJpYyhwYXJzaW5nX2RhdGFfZmlsdGVyZWQkcnQpCnBhcnNpbmdfZGF0YV9maWx0ZXJlZCA8LSBwYXJzaW5nX2RhdGFfZmlsdGVyZWQgJT4lCiAgZmlsdGVyKHBhcnNlID09IEZBTFNFIHwgcnQgPiAyMDApICU+JQogIGZpbHRlcih0cmlhbCAhPSAxKSAlPiUKICBmaWx0ZXIodHJpYWwgIT0gMTUxKSAlPiUKICBmaWx0ZXIodHJpYWwgIT0gMzAxKSAlPiUKICBmaWx0ZXIodHJpYWwgIT0gNDUxKQoKI2NvdW50IHRyaWFscyBzaW5jZSBhbmQgdG8gYmV0d2VlbgpwYXJzaW5nX2RhdGFfZmlsdGVyZWQgPC0gcGFyc2luZ19kYXRhX2ZpbHRlcmVkICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaWQsIGJsb2NrX251bWJlcikgJT4lCiAgbXV0YXRlKHRyaWFsc19zaW5jZV9iZXR3ZWVuID0gewogICAgY291bnRlciA8LSAwCiAgICBzYXBwbHkodHJhbnNpdGlvbl90eXBlLCBmdW5jdGlvbih4KSB7CiAgICAgIGlmICh4ID09ICJiZXR3ZWVuIikgewogICAgICAgIGNvdW50ZXIgPDwtIDAKICAgICAgfSBlbHNlIHsKICAgICAgICBjb3VudGVyIDw8LSBjb3VudGVyICsgMQogICAgICB9CiAgICAgIGNvdW50ZXIKICAgIH0pCiAgfSkKCnBhcnNpbmdfZGF0YV9maWx0ZXJlZCA8LSBwYXJzaW5nX2RhdGFfZmlsdGVyZWQgJT4lCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgYmxvY2tfbnVtYmVyKSAlPiUKICBtdXRhdGUodHJpYWxzX3RvX2JldHdlZW4gPSB7CiAgICBjb3VudGVyIDwtIE5BX2ludGVnZXJfCiAgICByZXZfcmVzdWx0IDwtIHJldihzYXBwbHkocmV2KHRyYW5zaXRpb25fdHlwZSksIGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKHggPT0gImJldHdlZW4iKSB7CiAgICAgICAgY291bnRlciA8PC0gMAogICAgICB9IGVsc2UgaWYgKCFpcy5uYShjb3VudGVyKSkgewogICAgICAgIGNvdW50ZXIgPDwtIGNvdW50ZXIgLSAxCiAgICAgIH0KICAgICAgY291bnRlcgogICAgfSkpCiAgICByZXZfcmVzdWx0CiAgfSkKYGBgCgpgYGB7ciBleGNsdWRlIHN1YmplY3RzIGZyb20gcGFyc2luZ30KCiNsb29rIGF0IGRpc3RyaWJ1dGlvbiBvZiBwYXJ0aWNpcGFudCBwYXJzaW5nIHJlc3BvbnNlcwp0b3RhbF9zdWJfcGFyc2UgPC0gcGFyc2luZ19kYXRhX2ZpbHRlcmVkICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JQogIHN1bW1hcml6ZSh0b3RhbF9wYXJzZSA9IHN1bShwYXJzZSksCiAgICAgICAgICAgIHRvdGFsX3RyYW5zaXRpb24gPSBzdW0odHJhbnNpdGlvbl90eXBlID09ICJiZXR3ZWVuIiwgbmEucm0gPSBUKSkKCiNwbG90CmdncGxvdCh0b3RhbF9zdWJfcGFyc2UsIGFlcyh4ID0gdG90YWxfcGFyc2UpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9IHBsb3RfY29sb3JzWzNdLCBjb2xvciA9ICJibGFjayIsIGJpbnMgPSA1MCkgKwogIHhsYWIoIlRvdGFsIFBhcnNpbmcgUmVzcG9uc2VzIikgKwogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHMiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBncmFwaF90aGVtZSgpCgoKI2ZpbHRlciBwYXJ0aWNpcGFudHMgd2hvIHBhcnNlZCA8IDEwIG9yID4gNTAwCnBhcnNpbmdfZGF0YV9maWx0ZXJlZCA8LSBwYXJzaW5nX2RhdGFfZmlsdGVyZWQgJT4lCiAgZmlsdGVyKHN1YmplY3RfaWQgJWluJSB0b3RhbF9zdWJfcGFyc2Ukc3ViamVjdF9pZFt0b3RhbF9zdWJfcGFyc2UkdG90YWxfcGFyc2UgPiAxMCAmIHRvdGFsX3N1Yl9wYXJzZSR0b3RhbF9wYXJzZSA8IDUwMF0pICU+JQogIG11dGF0ZSh3aXRoaW5fYmxvY2tfdHJpYWwgPSB0cmlhbCAtIDE1MCooYmxvY2tfbnVtYmVyIC0gMSkpCgpgYGAKCgojIyMgUGFyc2luZyByZXNwb25zZXMgYnkgYWdlLCB0cmlhbCwgdHJhbnNpdGlvbiB0eXBlCmBgYHtyIHBhcnNpbmcgbW9kZWx9Cgojc2VsZWN0IHZhcmlhYmxlcwpwYXJzaW5nX21vZGVsX2RhdGEgPC0gcGFyc2luZ19kYXRhX2ZpbHRlcmVkICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgcGFyc2UsIHJ0LCB0cmFuc2l0aW9uX3R5cGUsIHdpdGhpbl9ibG9ja190cmlhbCwgdHJpYWwsIGFnZSwgYWdlX2dyb3VwLCBwbGFuZXQsIGJsb2NrX251bWJlcikgCgojc2NhbGUKcGFyc2luZ19tb2RlbF9kYXRhJHRyaWFsX3ogPC0gc2NhbGVfdGhpcyhwYXJzaW5nX21vZGVsX2RhdGEkdHJpYWwpCnBhcnNpbmdfbW9kZWxfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWxfeiA8LSBzY2FsZV90aGlzKHBhcnNpbmdfbW9kZWxfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWwpCnBhcnNpbmdfbW9kZWxfZGF0YSRhZ2VfeiA8LSBzY2FsZV90aGlzKGFzLm51bWVyaWMocGFyc2luZ19tb2RlbF9kYXRhJGFnZSkpCnBhcnNpbmdfbW9kZWxfZGF0YSRzdWJqZWN0X2lkIDwtIGZhY3RvcihwYXJzaW5nX21vZGVsX2RhdGEkc3ViamVjdF9pZCkKcGFyc2luZ19tb2RlbF9kYXRhJHBsYW5ldCA8LSBmYWN0b3IocGFyc2luZ19tb2RlbF9kYXRhJHBsYW5ldCkKcGFyc2luZ19tb2RlbF9kYXRhJGJsb2NrX3ogPC0gc2NhbGVfdGhpcyhwYXJzaW5nX21vZGVsX2RhdGEkYmxvY2tfbnVtYmVyKQoKCiNydW4gcGFyc2luZyBhbmFseXNpcwpwYXJzaW5nX2J5X3RyYW5zaXRpb25fdHlwZSA8LSBtaXhlZChwYXJzZSB+IGFnZV96ICogYmxvY2tfeiAqIHdpdGhpbl9ibG9ja190cmlhbF96ICogdHJhbnNpdGlvbl90eXBlICArIChibG9ja196ICsgd2l0aGluX2Jsb2NrX3RyaWFsX3ogKyB0cmFuc2l0aW9uX3R5cGV8fCBzdWJqZWN0X2lkKSArICgxfHBsYW5ldCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzaW5nX21vZGVsX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyPSJib2J5cWEiLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfcmUgPSBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTFJUIikKCnByaW50X2xvZ19tb2RlbF9yZXN1bHRzKHBhcnNpbmdfYnlfdHJhbnNpdGlvbl90eXBlKQoKI3Npbmd1bGFyIGZpdCB3aXRoIGludGVyYWN0aW9ucyBpbiBSRQoKYGBgCgpgYGB7ciBwYXJzaW5nIG1vZGVsIHF1YWRyYXRpYyBhZ2V9CgojY29tcHV0ZSBxdWRhcnRpYyBhZ2UKcGFyc2luZ19tb2RlbF9kYXRhJGFnZV9zcXVhcmVkX3ogPC0gc2NhbGVfdGhpcyhhcy5udW1lcmljKHBhcnNpbmdfbW9kZWxfZGF0YSRhZ2VeMikpCgojcnVuIHBhcnNpbmcgYW5hbHlzaXMKcGFyc2luZ19ieV90cmFuc2l0aW9uX3R5cGVfcXVhZHJhdGljX2FnZSA8LSBtaXhlZChwYXJzZSB+IChhZ2VfeiArIGFnZV9zcXVhcmVkX3opICogYmxvY2tfeiAqIHdpdGhpbl9ibG9ja190cmlhbF96ICogdHJhbnNpdGlvbl90eXBlICArIChibG9ja196ICsgd2l0aGluX2Jsb2NrX3RyaWFsX3ogKyB0cmFuc2l0aW9uX3R5cGV8fCBzdWJqZWN0X2lkKSArICgxfHBsYW5ldCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzaW5nX21vZGVsX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyPSJib2J5cWEiLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfcmUgPSBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTFJUIikKCnByaW50X2xvZ19tb2RlbF9yZXN1bHRzKHBhcnNpbmdfYnlfdHJhbnNpdGlvbl90eXBlX3F1YWRyYXRpY19hZ2UpCgojY29tcGFyZSBtb2RlbHMgLSBxdWFkcmF0aWMgbW9kZWwgZG9lcyBub3QgZml0IGJldHRlcgphbm92YShwYXJzaW5nX2J5X3RyYW5zaXRpb25fdHlwZSwgcGFyc2luZ19ieV90cmFuc2l0aW9uX3R5cGVfcXVhZHJhdGljX2FnZSkKCiNxdWFkcmF0aWMgYWdlIG1vZGVsIGRvZXMgbm90IGZpdCBiZXR0ZXIKCmBgYAoKCiMjIyMgUGxvdDogUGFyc2luZyByZXNwb25zZXMgYnkgYWdlIGdyb3VwIGFuZCB0cmFuc2l0aW9uIHR5cGUKYGBge3IgcGxvdCBwYXJzaW5nLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNn0KCnBhcnNpbmdfc3ViX21lYW5zIDwtIHBhcnNpbmdfbW9kZWxfZGF0YSAlPiUKICBncm91cF9ieShzdWJqZWN0X2lkLCBhZ2VfZ3JvdXAsIHRyYW5zaXRpb25fdHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fc3ViX3BhcnNlID0gbWVhbihwYXJzZSwgbmEucm0gPSBUKSkKCnBhcnNpbmdfZ3JvdXBfbWVhbnMgPC0gcGFyc2luZ19zdWJfbWVhbnMgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCB0cmFuc2l0aW9uX3R5cGUpICU+JQogIHN1bW1hcml6ZShtZWFuX3BhcnNlID0gbWVhbihtZWFuX3N1Yl9wYXJzZSksCiAgICAgICAgICAgIHNlX3BhcnNlID0gc2QobWVhbl9zdWJfcGFyc2UpLyBzcXJ0KG4oKSkpCgojcGxvdApwYXJzaW5nX3Bsb3QgPC0gZ2dwbG90KHBhcnNpbmdfc3ViX21lYW5zLCBhZXMoeCA9IHRyYW5zaXRpb25fdHlwZSwgeSA9IG1lYW5fc3ViX3BhcnNlLCBjb2xvciA9IHRyYW5zaXRpb25fdHlwZSkpICsKICAgIGZhY2V0X3dyYXAofmFnZV9ncm91cCkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJqZWN0X2lkKSwgY29sb3IgPSAibGlnaHRncmV5IikgKwogICAgZ2VvbV9saW5lKGRhdGEgPSBwYXJzaW5nX2dyb3VwX21lYW5zLCBhZXMoeCA9IHRyYW5zaXRpb25fdHlwZSwgeSA9IG1lYW5fcGFyc2UsIGdyb3VwID0gYWdlX2dyb3VwKSwgY29sb3IgPSAiYmxhY2siKSArCiAgICBnZW9tX3BvaW50KGRhdGEgPSBwYXJzaW5nX2dyb3VwX21lYW5zLCBhZXMoeCA9IHRyYW5zaXRpb25fdHlwZSwgeSA9IG1lYW5fcGFyc2UpLCBzaXplID0gMywgc2hhcGUgPSAyMywgZmlsbCA9ICJibGFjayIpICsKICAgIGdlb21fZXJyb3JiYXIoZGF0YSA9IHBhcnNpbmdfZ3JvdXBfbWVhbnMsIGFlcyh4ID0gdHJhbnNpdGlvbl90eXBlLCB5ID0gbWVhbl9wYXJzZSwgeW1pbiA9IG1lYW5fcGFyc2UgLSBzZV9wYXJzZSwgeW1heCA9IG1lYW5fcGFyc2UgKyBzZV9wYXJzZSksIHdpZHRoID0uMSwgY29sb3IgPSAiYmxhY2siKSArCiAgICB4bGFiKCJUcmFuc2l0aW9uIFR5cGUiKSArCiAgICB5bGFiKCJQcm9wb3J0aW9uIG9mIFBhcnNpbmcgUmVzcG9uc2VzIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMocGxvdF9jb2xvcnNbMV0sIHBsb3RfY29sb3JzWzNdKSwgbmFtZSA9ICJUcmFuc2l0aW9uIFR5cGUiKSArCiAgICBncmFwaF90aGVtZSgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCiAjIGdndGl0bGUoIlBhcnNpbmciKQpwYXJzaW5nX3Bsb3QKYGBgCgojIyMgUGFyc2luZyByZXNwb25zZXMgYnkgYWdlLCB0cmlhbCwgdHJhbnNpdGlvbiB0eXBlLCBwbGFuZXQgbGFnCgpgYGB7ciBwYXJzaW5nIGJhc2VkIG9uIHBsYW5ldCByZWNlbmN5IGRhdGEgcHJvY2Vzc2luZ30KCnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSA8LSBwYXJzaW5nX2RhdGFfZmlsdGVyZWQgJT4lCiAgbXV0YXRlKHdpdGhpbl9ibG9ja190cmlhbCA9IHRyaWFsIC0gKDE1MCAqIChibG9ja19udW1iZXItMSkpKSAlPiUKICBncm91cF9ieShzdWJqZWN0X2lkKSAlPiUKICBncm91cF9ieShwbGFuZXQpICU+JQogIG11dGF0ZShwbGFuZXRfbGFnID0gd2l0aGluX2Jsb2NrX3RyaWFsIC0gbGFnKHdpdGhpbl9ibG9ja190cmlhbCwgZGVmYXVsdCA9IGZpcnN0KHdpdGhpbl9ibG9ja190cmlhbCkpIC0gMSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgcGFyc2UsIHJ0LCB0cmFuc2l0aW9uX3R5cGUsIHdpdGhpbl9ibG9ja190cmlhbCwgdHJpYWwsIGFnZSwgYWdlX2dyb3VwLCBwbGFuZXQsIHBsYW5ldF9sYWcsIGJsb2NrX251bWJlcikgJT4lCiAgI2Ryb3BfbmEoKSAlPiUKICBmaWx0ZXIocGxhbmV0X2xhZyA+IDApCgpgYGAKCmBgYHtyIHBhcnNpbmcgbW9kZWwgd2l0aCBib3RoIHJlY2VuY3kgYW5kIHRyYW5zaXRpb24gdHlwZX0KCnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSRhZ2VfeiA8LSBzY2FsZV90aGlzKHBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSRhZ2UpCnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWxfeiA8LSBzY2FsZV90aGlzKHBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWwpCnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSRwbGFuZXRfbGFnX3ogPC0gc2NhbGVfdGhpcyhwYXJzaW5nX3BsYW5ldF9yZWNlbmN5X2RhdGEkcGxhbmV0X2xhZykKcGFyc2luZ19wbGFuZXRfcmVjZW5jeV9kYXRhJHBhcnNlIDwtIGZhY3RvcihwYXJzaW5nX3BsYW5ldF9yZWNlbmN5X2RhdGEkcGFyc2UpCnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSRibG9ja196IDwtIHNjYWxlX3RoaXMocGFyc2luZ19wbGFuZXRfcmVjZW5jeV9kYXRhJGJsb2NrX251bWJlcikKCiNydW4gcGFyc2luZyBhbmFseXNpcwpwYXJzaW5nX2J5X3BsYW5ldF9lbmNvdW50ZXJfdHJhbnNpdGlvbl90eXBlIDwtIG1peGVkKHBhcnNlIH4gYWdlX3ogKiBibG9ja196ICogd2l0aGluX2Jsb2NrX3RyaWFsX3ogKiBwbGFuZXRfbGFnX3ogKiB0cmFuc2l0aW9uX3R5cGUgKyAoYmxvY2tfeiArIHBsYW5ldF9sYWdfeiArIHRyYW5zaXRpb25fdHlwZSB8fCBzdWJqZWN0X2lkKSArICgxfHBsYW5ldCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcGFyc2luZ19wbGFuZXRfcmVjZW5jeV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyPSJib2J5cWEiLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3JlID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJMUlQiKQoKcHJpbnRfbG9nX21vZGVsX3Jlc3VsdHMocGFyc2luZ19ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZSkKCiMgZWZmZWN0cyBvZjoKIyBhZ2UKIyB0cmlhbHMgc2luY2UgcGxhbmV0IAojIHRyYW5zaXRpb24gdHlwZQojIHRyaWFsIHggdHJpYWxzIHNpbmNlIHBsYW5ldAojIGFnZSB4IHRyYW5zaXRpb24gdHlwZQojIHRyaWFsIHggdHJhbnNpdGlvbiB0eXBlCgpgYGAKCgpgYGB7ciBwYXJzaW5nIG1vZGVsIHdpdGggYm90aCByZWNlbmN5IGFuZCB0cmFuc2l0aW9uIHR5cGUgcXVhZHJhdGljIGFnZSwgZXZhbCA9IEZ9CnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSRhZ2Vfc3F1YXJlZF96IDwtIHNjYWxlX3RoaXMocGFyc2luZ19wbGFuZXRfcmVjZW5jeV9kYXRhJGFnZV4yKQoKI3J1biBwYXJzaW5nIGFuYWx5c2lzCnBhcnNpbmdfYnlfcGxhbmV0X2VuY291bnRlcl90cmFuc2l0aW9uX3R5cGVfYWdlX3NxdWFyZWQgPC0gbWl4ZWQocGFyc2UgfiAoYWdlX3ogKyBhZ2Vfc3F1YXJlZF96KSAqIGJsb2NrX3ogKiB3aXRoaW5fYmxvY2tfdHJpYWxfeiAqIHBsYW5ldF9sYWdfeiAqIHRyYW5zaXRpb25fdHlwZSArIChwbGFuZXRfbGFnX3ogKyB0cmFuc2l0aW9uX3R5cGUgfHwgc3ViamVjdF9pZCkgKyAoMXxwbGFuZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplcj0iYm9ieXFhIiwgb3B0Q3RybD1saXN0KG1heGZ1bj0xZTYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF9yZSA9IFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTFJUIikKCnByaW50X2xvZ19tb2RlbF9yZXN1bHRzKHBhcnNpbmdfYnlfcGxhbmV0X2VuY291bnRlcl90cmFuc2l0aW9uX3R5cGVfYWdlX3NxdWFyZWQpCgojY29tcGFyZSBtb2RlbHMKYW5vdmEocGFyc2luZ19ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZSwgcGFyc2luZ19ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZV9hZ2Vfc3F1YXJlZCkKCmBgYAoKIyMjIENoaWxkcmVuLW9ubHkgcGFyc2luZyByZXNwb25zZXMgYnkgYWdlLCB0cmlhbCwgdHJhbnNpdGlvbiB0eXBlCmBgYHtyIGNoaWxkcmVuLW9ubHkgcGFyc2luZyBtb2RlbH0KCiNmaWx0ZXIgdG8gb25seSBpbmNsdWRlIGNoaWxkcmVuCnBhcnNpbmdfY2hpbGRfZGF0YSA8LSBwYXJzaW5nX3BsYW5ldF9yZWNlbmN5X2RhdGEgJT4lCiAgZmlsdGVyKGFnZSA8IDEzKQoKI3NjYWxlCnBhcnNpbmdfY2hpbGRfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWxfeiA8LSBzY2FsZV90aGlzKHBhcnNpbmdfY2hpbGRfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWwpCnBhcnNpbmdfY2hpbGRfZGF0YSRibG9ja196IDwtIHNjYWxlX3RoaXMocGFyc2luZ19jaGlsZF9kYXRhJGJsb2NrX251bWJlcikKcGFyc2luZ19jaGlsZF9kYXRhJHN1YmplY3RfaWQgPC0gZmFjdG9yKHBhcnNpbmdfY2hpbGRfZGF0YSRzdWJqZWN0X2lkKQpwYXJzaW5nX2NoaWxkX2RhdGEkcGxhbmV0IDwtIGZhY3RvcihwYXJzaW5nX2NoaWxkX2RhdGEkcGxhbmV0KQpwYXJzaW5nX2NoaWxkX2RhdGEkcGxhbmV0X2xhZ196IDwtIHNjYWxlX3RoaXMocGFyc2luZ19jaGlsZF9kYXRhJHBsYW5ldF9sYWcpCgoKI3J1biBwYXJzaW5nIGFuYWx5c2lzCnBhcnNpbmdfYnlfdHJhbnNpdGlvbl90eXBlX2NoaWxkcmVuIDwtIG1peGVkKHBhcnNlIH4gYmxvY2tfeiAqIHdpdGhpbl9ibG9ja190cmlhbF96ICogcGxhbmV0X2xhZ196ICogdHJhbnNpdGlvbl90eXBlICArICh3aXRoaW5fYmxvY2tfdHJpYWxfeiArIHBsYW5ldF9sYWdfeiArIHRyYW5zaXRpb25fdHlwZXx8IHN1YmplY3RfaWQpICsgKDF8cGxhbmV0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBhcnNpbmdfY2hpbGRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsIG9wdEN0cmw9bGlzdChtYXhmdW49MWU2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF9yZSA9IFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJMUlQiKQoKcHJpbnRfbG9nX21vZGVsX3Jlc3VsdHMocGFyc2luZ19ieV90cmFuc2l0aW9uX3R5cGVfY2hpbGRyZW4pCgpgYGAKCgoKIyMjIyBQbG90OiBQYXJzaW5nIHJlc3BvbnNlcyBieSBhZ2UsIHRyYW5zaXRpb24gdHlwZSwgcGxhbmV0IGxhZywgdHJpYWwKYGBge3IgcGxvdCBwYXJzaW5nIHBsYW5ldCBsYWcsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSA2fQoKI3JlLXJ1biBtb2RlbCBhbmQgZXh0cmFjdCBnbG1lciBvYmplY3QKcGFyc2luZ19ieV9wbGFuZXRfZW5jb3VudGVyX3RyYW5zaXRpb25fdHlwZS5nbG1lciA8LSBtaXhlZChwYXJzZSB+IGFnZV96ICpibG9ja196ICogd2l0aGluX2Jsb2NrX3RyaWFsX3ogKiBwbGFuZXRfbGFnX3ogKiB0cmFuc2l0aW9uX3R5cGUgKyAocGxhbmV0X2xhZ196ICsgdHJhbnNpdGlvbl90eXBlIHx8IHN1YmplY3RfaWQpICsgKDF8cGxhbmV0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzaW5nX3BsYW5ldF9yZWNlbmN5X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsIG9wdEN0cmw9bGlzdChtYXhmdW49MWU2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfcmUgPSBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIkxSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPSAibWVyTW9kIikKCgoKcGxvdF9tb2RlbChwYXJzaW5nX2J5X3BsYW5ldF9lbmNvdW50ZXJfdHJhbnNpdGlvbl90eXBlLmdsbWVyLCAKICAgICAgICAgICB0eXBlID0gInByZWQiLCAKICAgICAgICAgICBsaW5lLnNpemUgPSAxLjUsCiAgICAgICAgICAgdGVybXMgPSBjKCJ3aXRoaW5fYmxvY2tfdHJpYWxfeiIsICJ0cmFuc2l0aW9uX3R5cGUiLCAiYWdlX3oiKSwgCiAgICAgICAgICAgY29sb3JzID0gYyhwbG90X2NvbG9yc1sxXSwgcGxvdF9jb2xvcnNbM10pLAogICAgICAgICAgIGxlZ2VuZC50aXRsZT0iVHJhbnNpdGlvbiBUeXBlIikgKwogIHhsYWIoIlRyaWFsICh6LXNjb3JlZCkiKSArCiAgeWxhYigiUHJlZGljdGVkIFBhcnNpbmcgUHJvYmFiaWxpdHkiKSArCiAgZ2d0aXRsZSgiIikgKyAKICBncmFwaF90aGVtZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQoKcGxvdF9tb2RlbChwYXJzaW5nX2J5X3BsYW5ldF9lbmNvdW50ZXJfdHJhbnNpdGlvbl90eXBlLmdsbWVyLCAKICAgICAgICAgICB0eXBlID0gInByZWQiLCAKICAgICAgICAgICBsaW5lLnNpemUgPSAxLjUsCiAgICAgICAgICAgdGVybXMgPSBjKCJwbGFuZXRfbGFnX3oiLCAid2l0aGluX2Jsb2NrX3RyaWFsX3oiLCAiYWdlX3oiKSwgCiAgICAgICAgICAgY29sb3JzID0gYyhwbG90X2NvbG9yc1sxXSwgcGxvdF9jb2xvcnNbMl0sIHBsb3RfY29sb3JzWzNdKSwKICAgICAgICAgICBsZWdlbmQudGl0bGU9IlRyaWFsIChaKSIpICsKICB4bGFiKCJQbGFuZXQgTGFnICh6LXNjb3JlZCkiKSArCiAgeWxhYigiUHJlZGljdGVkIFBhcnNpbmcgUHJvYmFiaWxpdHkiKSArCiAgZ2d0aXRsZSgiIikgKyAKICBncmFwaF90aGVtZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQoKYGBgCgoKCiMjIyBQbG90OiBQcm9iYWJpbGl0eSBvZiBwYXJzaW5nIGFzIGEgZnVuY3RvbiBvZiB0cmlhbHMgYXJvdW5kIHRyYW5zaXRpb24gdHlwZXMKYGBge3IgcGxvdCBwYXJzaW5nIGJ5IHRyaWFscyBmcm9tIGJldHdlZW4gdHJhbnNpdGlvbiwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDR9CgpwYXJzaW5nX2FmdGVyX3RyYW5zaXRpb25zX3N1YiA8LSBwYXJzaW5nX2RhdGFfZmlsdGVyZWQgJT4lCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgdHJpYWxzX3NpbmNlX2JldHdlZW4pICU+JQogIHN1bW1hcml6ZShtZWFuX3N1Yl9wYXJzZSA9IG1lYW4ocGFyc2UsIG5hLnJtID0gVFJVRSkpICU+JQogICBmaWx0ZXIodHJpYWxzX3NpbmNlX2JldHdlZW4gPCA1KQoKcGFyc2luZ19hZnRlcl90cmFuc2l0aW9ucyA8LSBwYXJzaW5nX2FmdGVyX3RyYW5zaXRpb25zX3N1YiAlPiUKICBncm91cF9ieSh0cmlhbHNfc2luY2VfYmV0d2VlbikgJT4lCiAgc3VtbWFyaXplKG1lYW5fcGFyc2UgPSBtZWFuKG1lYW5fc3ViX3BhcnNlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZV9wYXJzZSA9IHNkKG1lYW5fc3ViX3BhcnNlLCBuYS5ybSA9IFRSVUUpL3NxcnQobigpKSkgJT4lCiAgZmlsdGVyKHRyaWFsc19zaW5jZV9iZXR3ZWVuIDwgNSkKCiNtYWtlIGJhciBwbG90CnBhcnNpbmdfYWZ0ZXJfdHJhbnNpdGlvbiA8LSBnZ3Bsb3QocGFyc2luZ19hZnRlcl90cmFuc2l0aW9ucywgYWVzKHggPSBmYWN0b3IodHJpYWxzX3NpbmNlX2JldHdlZW4pLCB5ID0gbWVhbl9wYXJzZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBmaWxsID0gcGxvdF9jb2xvcnNbMV0sIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3BhcnNlIC0gc2VfcGFyc2UsIHltYXggPSBtZWFuX3BhcnNlICsgc2VfcGFyc2UpLCB3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpKSArCiAgeWxhYigiTWVhbiBQcm9wb3J0aW9uIG9mIFBhcnNpbmcgUmVzcG9uc2VzIikgKwogIHhsYWIoIlRyaWFscyBTaW5jZSBMYXN0IEJldHdlZW4gVHJhbnNpdGlvbiIpICsgCiAgZ3JhcGhfdGhlbWUoKQpwYXJzaW5nX2FmdGVyX3RyYW5zaXRpb24KCmBgYAoKYGBge3IgcGxvdCBwYXJzaW5nIGJ5IHRyaWFscyBiZWZvcmUgYmV0d2VlbiB0cmFuc2l0aW9uLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNH0KCnBhcnNpbmdfYmVmb3JlX3RyYW5zaXRpb25zX3N1YiA8LSBwYXJzaW5nX2RhdGFfZmlsdGVyZWQgJT4lCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgdHJpYWxzX3RvX2JldHdlZW4pICU+JQogIHN1bW1hcml6ZShtZWFuX3N1Yl9wYXJzZSA9IG1lYW4ocGFyc2UsIG5hLnJtID0gVFJVRSkpICU+JQogICBmaWx0ZXIodHJpYWxzX3RvX2JldHdlZW4gPiAtNSkKCnBhcnNpbmdfYmVmb3JlX3RyYW5zaXRpb25zIDwtIHBhcnNpbmdfYmVmb3JlX3RyYW5zaXRpb25zX3N1YiAlPiUKICBncm91cF9ieSh0cmlhbHNfdG9fYmV0d2VlbikgJT4lCiAgc3VtbWFyaXplKG1lYW5fcGFyc2UgPSBtZWFuKG1lYW5fc3ViX3BhcnNlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZV9wYXJzZSA9IHNkKG1lYW5fc3ViX3BhcnNlLCBuYS5ybSA9IFRSVUUpL3NxcnQobigpKSkgJT4lCiAgZmlsdGVyKHRyaWFsc190b19iZXR3ZWVuID4gLTUpCgojbWFrZSBiYXIgcGxvdApwYXJzaW5nX2JlZm9yZV90cmFuc2l0aW9uIDwtIGdncGxvdChwYXJzaW5nX2JlZm9yZV90cmFuc2l0aW9ucywgYWVzKHggPSBmYWN0b3IodHJpYWxzX3RvX2JldHdlZW4pLCB5ID0gbWVhbl9wYXJzZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBmaWxsID0gcGxvdF9jb2xvcnNbMl0sIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3BhcnNlIC0gc2VfcGFyc2UsIHltYXggPSBtZWFuX3BhcnNlICsgc2VfcGFyc2UpLCB3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpKSArCiAgeWxhYigiTWVhbiBQcm9wb3J0aW9uIG9mIFBhcnNpbmcgUmVzcG9uc2VzIikgKwogIHhsYWIoIlRyaWFscyBMZWFkaW5nIFRvIEJldHdlZW4gVHJhbnNpdGlvbiIpICsgCiAgZ3JhcGhfdGhlbWUoKQpwYXJzaW5nX2JlZm9yZV90cmFuc2l0aW9uCgpgYGAKCgojIEdyYXBoIHJlY29uc3RydWN0aW9uCmBgYHtyIHJlYWQgaW4gcmVjb25zdHJ1Y3Rpb24gZGF0YX0KCmdyYXBoX2RhdGEgPC0gbGlzdC5maWxlcyhwYXRoID0gZGF0YV9kaXIsICAKICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gImdyYXBoX3JlY29uc3RydWN0aW9uKiIsIAogICAgICAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKSAlPiUgCiAgbGFwcGx5KHJlYWRfY3N2KSAlPiUKICBiaW5kX3Jvd3MgCgojYWRkIGNvbW11bml0aWVzCmdyYXBoX2RhdGEgPC0gaW5uZXJfam9pbihncmFwaF9kYXRhLCBjb21tdW5pdGllcywgYnkgPSBjKCdzdWJqZWN0X2lkJywgJ3BsYW5ldCcpKSAlPiUKICBtdXRhdGUoY29tbXVuaXR5X251bSA9IHBhcnNlX251bWJlcihjb21tdW5pdHkpKQoKI29ubHkgaW5jbHVkZSBzdWJqZWN0cyBpbmNsdWRlZCBpbiBsZWFybmluZwpncmFwaF9kYXRhIDwtIGdyYXBoX2RhdGEgJT4lCiAgZmlsdGVyKHN1YmplY3RfaWQgJWluJSBsZWFybmluZ19zdWJzJHN1YmplY3RfaWQpCgpgYGAKCiMjIEZpbHRlciBvdXQgc3ViamVjdHMgd2hvIGRpZG4ndCBtb3ZlIHRoZSBwbGFuZXRzCmBgYHtyIGZpbHRlciBncmFwaCByZWNvbnN0cnVjdGlvbiBkYXRhfQoKI2RldGVybWluZSBzdWJqZWN0cyB3aG8gZGlkbid0IG1vdmUgYW55IHBsYW5ldHMKZ3JhcGhfbW92ZW1lbnRfc3VtbWFyeSA8LSBncmFwaF9kYXRhICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaWQsIHBsYW5ldCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsX21vdmVtZW50ID0gc3VtKHNxcnQoKHggLSB4X2luaXQpXjIgKyAoeSAtIHlfaW5pdCleMikpKSAlPiUKICBncm91cF9ieShzdWJqZWN0X2lkKSAlPiUKICBzdW1tYXJpemUobm9fbW92ZW1lbnRfcGxhbmV0cyA9IHN1bSh0b3RhbF9tb3ZlbWVudCA9PSAwKSkKCiNkZXRlcm1pbmUgaG93IG1hbnkgcGxhbmV0cyBlYWNoIHBhcnRpY2lwYW50IG1vdmVkCmdyYXBoX21vdmVtZW50X3N1bW1hcnlfcGxvdCA8LSBnZ3Bsb3QoZ3JhcGhfbW92ZW1lbnRfc3VtbWFyeSwgYWVzKHggPSBub19tb3ZlbWVudF9wbGFuZXRzKSkgKwogIGdlb21faGlzdG9ncmFtKGZpbGwgPSBwbG90X2NvbG9yc1szXSwgY29sb3IgPSAiYmxhY2siLCBiaW5zID0gMTYpICsKICB4bGFiKCJOdW1iZXIgb2YgUGxhbmV0cyBOb3QgTW92ZWQiKSArCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIpICsKICBncmFwaF90aGVtZSgpCmdyYXBoX21vdmVtZW50X3N1bW1hcnlfcGxvdAoKI292ZXJhbGwgc3RhdHMKcGxhbmV0X21vdmVtZW50X3N1bW1hcnkgPC0gZ3JhcGhfbW92ZW1lbnRfc3VtbWFyeSAlPiUKICBzdW1tYXJpemUobWVhbl9ub19tb3ZlbWVudCA9IG1lYW4obm9fbW92ZW1lbnRfcGxhbmV0cyksCiAgICAgICAgICAgIG1lYW5fbl9tb3ZlbWVudCA9IG1lYW4oMTUgLSBub19tb3ZlbWVudF9wbGFuZXRzKSwKICAgICAgICAgICAgc2Rfbm9fbW92ZW1lbnQgPSBzZChub19tb3ZlbWVudF9wbGFuZXRzKSwKICAgICAgICAgICAgc2Rfbl9tb3ZlbWVudCA9IHNkKDE1IC0gbm9fbW92ZW1lbnRfcGxhbmV0cyksCiAgICAgICAgICAgIG1heF9ub19tb3ZlbWVudCA9IG1heChub19tb3ZlbWVudF9wbGFuZXRzKSwKICAgICAgICAgICAgbWluX25vX21vdmVtZW50ID0gbWluKG5vX21vdmVtZW50X3BsYW5ldHMpKQpwbGFuZXRfbW92ZW1lbnRfc3VtbWFyeQogICAgICAgICAgICAKYGBgCgojIyBDb21wdXRlIGVtcGlyaWNhbCBkaXN0YW5jZSBtYXRyaWNlcwpgYGB7ciBlbXBpcmljYWwgZ3JhcGggcmVjb25zdHJ1Y3Rpb24gbWF0cmljZXN9CgojZm9yIGVhY2ggcGFydGljaXBhbnQsIGNvbnN0cnVjdCBtYXRyaXggb2YgcGFpcndpc2UgZGlzdGFuY2VzIGJldHdlZW4gcGxhbmV0cwpncmFwaF9yZWNvbnN0cnVjdGlvbl9tYXRyaXggPC0gZnVuY3Rpb24oZGYpIHsKICBzdWJqZWN0cyA8LSB1bmlxdWUoZGYkc3ViamVjdF9pZCkKICByZXN1bHRzIDwtIGxpc3QoKQogIAogIGZvciAoc3ViamVjdCBpbiBzdWJqZWN0cykgewogICAgc3ViamVjdF9kZiA8LSBkZltkZiRzdWJqZWN0X2lkID09IHN1YmplY3QsIF0KICAgIGRpc3RhbmNlX21hdHJpeCA8LSBwcm94eTo6ZGlzdChzdWJqZWN0X2RmWywgYygieCIsICJ5IildLCBtZXRob2QgPSAiZXVjbGlkZWFuIikKICAgIHJlc3VsdHNbW2FzLmNoYXJhY3RlcihzdWJqZWN0KV1dIDwtIGFzLm1hdHJpeChkaXN0YW5jZV9tYXRyaXgpCiAgfQogIAogICNub3JtYWxpemUgYWxsIGRpc3RhbmNlcyBieSBkaXZpZGluZyBieSBtYXgKICByZXN1bHRzIDwtIGxhcHBseShyZXN1bHRzLCBmdW5jdGlvbihtYXQpIHsKICAgIG1heF92YWwgPC0gbWF4KG1hdCwgbmEucm0gPSBUUlVFKQogICAgbWF0IC9tYXhfdmFsCiAgfSkKICAKICByZXR1cm4ocmVzdWx0cykKfQoKZ3JhcGhfcmVjb25zdHJ1Y3Rpb25fbWF0cmljZXMgPC0gZ3JhcGhfcmVjb25zdHJ1Y3Rpb25fbWF0cml4KGdyYXBoX2RhdGEpCgpgYGAKCiMjIENvbXB1dGUgZ3JvdW5kLXRydXRoIGdlb2Rlc2ljIGRpc3RhbmNlcwpgYGB7ciBnZW9kZXNpYyBkaXN0YW5jZSBtYXRyaXh9CgojICBjb25zdHJ1Y3QgZ2VvZGVzaWMgZGlzdGFuY2UgbWF0cml4IGJhc2VkIG9uIG5vZGUKZWRnZXMgPC0gYygxLCAyLAogICAgICAgICAgIDEsIDMsCiAgICAgICAgICAgMSwgNCwKICAgICAgICAgICAxLCAxNSwKICAgICAgICAgICAyLCAzLAogICAgICAgICAgIDIsIDQsCiAgICAgICAgICAgMiwgNSwKICAgICAgICAgICAzLCA0LCAKICAgICAgICAgICAzLCA1LAogICAgICAgICAgIDQsIDUsCiAgICAgICAgICAgNSwgNiwKICAgICAgICAgICA2LCA3LAogICAgICAgICAgIDYsIDgsIAogICAgICAgICAgIDYsIDksCiAgICAgICAgICAgNywgOCwKICAgICAgICAgICA3LCA5LAogICAgICAgICAgIDcsIDEwLAogICAgICAgICAgIDgsIDksCiAgICAgICAgICAgOCwgMTAsCiAgICAgICAgICAgOSwgMTAsCiAgICAgICAgICAgMTAsIDExLAogICAgICAgICAgIDExLCAxMiwKICAgICAgICAgICAxMSwgMTMsCiAgICAgICAgICAgMTEsIDE0LAogICAgICAgICAgIDEyLCAxMywgCiAgICAgICAgICAgMTIsIDE0LCAKICAgICAgICAgICAxMiwgMTUsCiAgICAgICAgICAgMTMsIDE0LAogICAgICAgICAgIDEzLCAxNSwKICAgICAgICAgICAxNCwgMTUpCgpnIDwtIGdyYXBoKGVkZ2VzLCBkaXJlY3RlZCA9IEZBTFNFKQpkaXN0X21hdCA8LSBkaXN0YW5jZXMoZykKcm93bmFtZXMoZGlzdF9tYXQpIDwtIGNvbG5hbWVzKGRpc3RfbWF0KSA8LSBhcy5jaGFyYWN0ZXIoMToxNSkKCgojIFJlbGFiZWwgZm9yIGVhY2ggc3ViamVjdCBiYXNlZCBvbiB0aGVpciBub2RlIOKGkiBzdGltX2lkIG1hcHBpbmcKc3ViamVjdF9kaXN0X21hdHMgPC0gbGlzdCgpCgpmb3IgKHN1YiBpbiB1bmlxdWUoYWxsX3BsYW5ldHMkc3ViamVjdF9pZCkpIHsKICAKICBzdWJfcGxhbmV0cyA8LSBhbGxfcGxhbmV0cyAlPiUgZmlsdGVyKHN1YmplY3RfaWQgPT0gc3ViKQogIAogICMgTWFwIG5vZGUgSURzICgx4oCTMTUpIOKGkiBzdGltX2lkIGZvciB0aGlzIHN1YmplY3QKICBub2RlX3RvX3N0aW0gPC0gc2V0TmFtZXMoc3ViX3BsYW5ldHMkc3RpbV9pZCwgYXMuY2hhcmFjdGVyKHN1Yl9wbGFuZXRzJG5vZGUpKQogIAogICMgTWFrZSBhIGNvcHkgYW5kIHJlbGFiZWwKICBkaXN0X21hdF9zdWIgPC0gZGlzdF9tYXQKICAKICAjIFJlbGFiZWwgd2l0aCBzdGltX2lkCiAgcm93bmFtZXMoZGlzdF9tYXRfc3ViKSA8LSBub2RlX3RvX3N0aW1bcm93bmFtZXMoZGlzdF9tYXRfc3ViKV0KICBjb2xuYW1lcyhkaXN0X21hdF9zdWIpIDwtIG5vZGVfdG9fc3RpbVtjb2xuYW1lcyhkaXN0X21hdF9zdWIpXQoKICAjIEFzc3VtaW5nIHJvdyBhbmQgY29sIG5hbWVzIGFyZSBjaGFyYWN0ZXIgdmVyc2lvbnMgb2YgbnVtYmVycywgY29udmVydCB0byBudW1lcmljCiAgc3RpbV9pZHMgPC0gYXMubnVtZXJpYyhyb3duYW1lcyhkaXN0X21hdF9zdWIpKQoKICAjIFNvcnQgc3RpbV9pZHMgbnVtZXJpY2FsbHkKICBzdGltX29yZGVyIDwtIHNvcnQoc3RpbV9pZHMpCgogICMgQ29udmVydCBiYWNrIHRvIGNoYXJhY3RlciB0byB1c2UgYXMgcm93L2NvbCBuYW1lcwogIHN0aW1fb3JkZXJfY2hyIDwtIGFzLmNoYXJhY3RlcihzdGltX29yZGVyKQoKIyBSZW9yZGVyIGRpc3RhbmNlIG1hdHJpeAogIGRpc3RfbWF0X3N1YiA8LSBkaXN0X21hdF9zdWJbc3RpbV9vcmRlcl9jaHIsIHN0aW1fb3JkZXJfY2hyXQogIAogIHN1YmplY3RfZGlzdF9tYXRzW1thcy5jaGFyYWN0ZXIoc3ViKV1dIDwtIGRpc3RfbWF0X3N1Ygp9CgpgYGAKCgoKIyMgUlNBIHdpdGggZ2VvZGVzaWMgbWF0cml4CgpgYGB7ciByZXByZXNlbnRhdGlvbmFsIHNpbWlsYXJpdHkgYW5hbHlzZXN9CgojIEdldCBzdWJqZWN0IElEcyBwcmVzZW50IGluIGJvdGgKY29tbW9uX3N1YmplY3RzIDwtIGludGVyc2VjdChuYW1lcyhncmFwaF9yZWNvbnN0cnVjdGlvbl9tYXRyaWNlcyksIG5hbWVzKHN1YmplY3RfZGlzdF9tYXRzKSkKCiMgRmlsdGVyIGJvdGggbGlzdHMgdG8gc2hhcmVkIHN1YmplY3RzLCBwcmVzZXJ2aW5nIG9yZGVyCmdyYXBoX3JlY29uc3RydWN0aW9uX2ZpbHRlcmVkIDwtIGdyYXBoX3JlY29uc3RydWN0aW9uX21hdHJpY2VzW2NvbW1vbl9zdWJqZWN0c10Kc3ViamVjdF9kaXN0X21hdHNfZmlsdGVyZWQgPC0gc3ViamVjdF9kaXN0X21hdHNbY29tbW9uX3N1YmplY3RzXQoKIyBGdW5jdGlvbiB0byBjb21wdXRlIFBlYXJzb24gY29ycmVsYXRpb24gYmV0d2VlbiB0d28gZGlzdGFuY2UgbWF0cmljZXMKY29tcHV0ZV9zaW1pbGFyaXR5IDwtIGZ1bmN0aW9uKG1hdDEsIG1hdDIpIHsKICB2ZWMxIDwtIGFzLnZlY3RvcihtYXQxW2xvd2VyLnRyaShtYXQxKV0pCiAgdmVjMiA8LSBhcy52ZWN0b3IobWF0Mltsb3dlci50cmkobWF0MildKQogIGNvcih2ZWMxLCB2ZWMyLCBtZXRob2QgPSAicGVhcnNvbiIpCn0KCiMgQ29tcHV0ZSBzaW1pbGFyaXR5IGZvciBlYWNoIHN1YmplY3QKc2ltaWxhcml0aWVzIDwtIG1hcHBseShjb21wdXRlX3NpbWlsYXJpdHksIGdyYXBoX3JlY29uc3RydWN0aW9uX2ZpbHRlcmVkLCBzdWJqZWN0X2Rpc3RfbWF0c19maWx0ZXJlZCkKbmFtZXMoc2ltaWxhcml0aWVzKSA8LSBuYW1lcyhncmFwaF9yZWNvbnN0cnVjdGlvbl9maWx0ZXJlZCkKCnNpbWlsYXJpdHlfZGYgPC0gYXMuZGF0YS5mcmFtZShzaW1pbGFyaXRpZXMpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAic3ViamVjdF9pZCIpICU+JQogIHJlbmFtZShyc2EgPSBzaW1pbGFyaXRpZXMpICU+JQogIG11dGF0ZShzdWJqZWN0X2lkID0gYXMubnVtZXJpYyhzdWJqZWN0X2lkKSkgJT4lCiAgaW5uZXJfam9pbihhZ2VfZGF0YSwgYnkgPSAic3ViamVjdF9pZCIpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBjYXNlX3doZW4oYWdlIDwgMTMgfiAiQ2hpbGRyZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA+IDEyLjk5ICYgYWdlIDwgMTggfiAiQWRvbGVzY2VudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA+IDE3Ljk5IH4gIkFkdWx0cyIpKQoKc2ltaWxhcml0eV9kZiRhZ2VfZ3JvdXAgPC0gZmFjdG9yKHNpbWlsYXJpdHlfZGYkYWdlX2dyb3VwLCBsZXZlbHMgPSBjKCJDaGlsZHJlbiIsICJBZG9sZXNjZW50cyIsICJBZHVsdHMiKSkKYGBgCgoKYGBge3IgcGxvdHMgb2YgYmVzdCBhbmQgd29yc3QgZ3JhcGggcmVjb25zdHJ1Y3Rpb24gc3ViamVjdCwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDV9CgpzaW1pbGFyaXR5X2RmIDwtIHNpbWlsYXJpdHlfZGYgJT4lIAogIGFycmFuZ2UocnNhKQoKI2Jlc3Qgc3ViamVjdAojIHNlbGVjdCBzdWJqZWN0CnN1Yl9pZCA8LSBzaW1pbGFyaXR5X2RmJHN1YmplY3RfaWRbbnJvdyhzaW1pbGFyaXR5X2RmKV0KCiNnZXQgc3ViamVjdCBjb21tdW5pdGllcwpzdWJfY29tbXVuaXRpZXMgPC0gbGVhcm5pbmdfZGF0YSAlPiUKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBzdWJfaWQpICU+JQogIHNlbGVjdChwbGFuZXQsIGNvbW11bml0eSkgJT4lCiAgZGlzdGluY3QoKQoKI2dldCBzdWIgaW50ZXJpb3IgdnMuIGV4dGVyaW9yCnN1Yl9wbGFuZXRfdHlwZSA8LSBhbGxfcGxhbmV0cyAlPiUKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBzdWJfaWQpICU+JQogIHNlbGVjdChwbGFuZXQgPSBzdGltX2lkLCBwbGFuZXRfdHlwZSkKCiNjb21iaW5lCnN1Yl9wbGFuZXRfaW5mbyA8LSBmdWxsX2pvaW4oc3ViX2NvbW11bml0aWVzLCBzdWJfcGxhbmV0X3R5cGUsIGJ5ID0gInBsYW5ldCIpICU+JQogIG11dGF0ZShwbGFuZXQgPSBhcy5jaGFyYWN0ZXIocGxhbmV0KSkKCgojZ2V0IHgveSBjb29yZGluYXRlcwpkZiA8LSBncmFwaF9kYXRhICU+JSAKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBzdWJfaWQpICU+JQogIHNlbGVjdChwbGFuZXQsIHgsIHkpICU+JQogIG11dGF0ZShwbGFuZXQgPSBhcy5jaGFyYWN0ZXIocGxhbmV0KSkKCiMgQWRkIGNvbW11bml0eSBhbmQgcGxhbmV0IHR5cGUgaW5mb3JtYXRpb24KZGYgPC0gZGYgJT4lCiAgbGVmdF9qb2luKHN1Yl9wbGFuZXRfaW5mbywgYnkgPSAicGxhbmV0IikgJT4lCiAgbXV0YXRlKHBsYW5ldF90eXBlID0gZmFjdG9yKHBsYW5ldF90eXBlLCBsZXZlbHMgPSBjKCJpbnRlcmlvciIsICJleHRlcmlvciIpKSwKICAgICAgICAgY29tbXVuaXR5X251bSA9IHBhcnNlX251bWJlcihjb21tdW5pdHkpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IHBsYW5ldCwgY29sb3IgPSBmYWN0b3IoY29tbXVuaXR5X251bSksIGFscGhhID0gcGxhbmV0X3R5cGUpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdndGl0bGUoIkdyYXBoIFJlY29uc3RydWN0aW9uOiBCZXN0IFBhcnRpY2lwYW50IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKHBsb3RfY29sb3JzWzFdLCBwbG90X2NvbG9yc1syXSwgcGxvdF9jb2xvcnNbM10pLCBuYW1lID0gIkNvbW11bml0eSIpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYyguNSwgMSksIG5hbWUgPSAiUGxhbmV0IFR5cGUiLCBsYWJlbHMgPSBjKCJJbnRlcmlvciIsICJFeHRlcmlvciIpKSArCiAgZ3JhcGhfdGhlbWUoKSArCiAgdGhlbWUodGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArIAogIGNvb3JkX2VxdWFsKCkKCgojd29yc3Qgc3ViamVjdAojIHNlbGVjdCBzdWJqZWN0CnN1Yl9pZCA8LSBzaW1pbGFyaXR5X2RmJHN1YmplY3RfaWRbMV0KCiNnZXQgc3ViamVjdCBjb21tdW5pdGllcwpzdWJfY29tbXVuaXRpZXMgPC0gbGVhcm5pbmdfZGF0YSAlPiUKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBzdWJfaWQpICU+JQogIHNlbGVjdChwbGFuZXQsIGNvbW11bml0eSkgJT4lCiAgZGlzdGluY3QoKQoKI2dldCBzdWIgaW50ZXJpb3IgdnMuIGV4dGVyaW9yCnN1Yl9wbGFuZXRfdHlwZSA8LSBhbGxfcGxhbmV0cyAlPiUKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBzdWJfaWQpICU+JQogIHNlbGVjdChwbGFuZXQgPSBzdGltX2lkLCBwbGFuZXRfdHlwZSkKCiNjb21iaW5lCnN1Yl9wbGFuZXRfaW5mbyA8LSBmdWxsX2pvaW4oc3ViX2NvbW11bml0aWVzLCBzdWJfcGxhbmV0X3R5cGUsIGJ5ID0gInBsYW5ldCIpICU+JQogIG11dGF0ZShwbGFuZXQgPSBhcy5jaGFyYWN0ZXIocGxhbmV0KSkKCgojZ2V0IHgveSBjb29yZGluYXRlcwpkZiA8LSBncmFwaF9kYXRhICU+JSAKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBzdWJfaWQpICU+JQogIHNlbGVjdChwbGFuZXQsIHgsIHkpICU+JQogIG11dGF0ZShwbGFuZXQgPSBhcy5jaGFyYWN0ZXIocGxhbmV0KSkKCiMgQWRkIGNvbW11bml0eSBhbmQgcGxhbmV0IHR5cGUgaW5mb3JtYXRpb24KZGYgPC0gZGYgJT4lCiAgbGVmdF9qb2luKHN1Yl9wbGFuZXRfaW5mbywgYnkgPSAicGxhbmV0IikgJT4lCiAgICBtdXRhdGUocGxhbmV0X3R5cGUgPSBmYWN0b3IocGxhbmV0X3R5cGUsIGxldmVscyA9IGMoImludGVyaW9yIiwgImV4dGVyaW9yIikpLAogICAgICAgICBjb21tdW5pdHlfbnVtID0gcGFyc2VfbnVtYmVyKGNvbW11bml0eSkpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0geCwgeSA9IHksIGxhYmVsID0gcGxhbmV0LCBjb2xvciA9IGZhY3Rvcihjb21tdW5pdHlfbnVtKSwgYWxwaGEgPSBwbGFuZXRfdHlwZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2d0aXRsZSgiR3JhcGggUmVjb25zdHJ1Y3Rpb246IFdvcnN0IFBhcnRpY2lwYW50IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKHBsb3RfY29sb3JzWzFdLCBwbG90X2NvbG9yc1syXSwgcGxvdF9jb2xvcnNbM10pLCBuYW1lID0gIkNvbW11bml0eSIpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYyguMywgMSksIG5hbWUgPSAiUGxhbmV0IFR5cGUiLCBsYWJlbHMgPSBjKCJJbnRlcmlvciIsICJFeHRlcmlvciIpKSArCiAgZ3JhcGhfdGhlbWUoKSArCiAgdGhlbWUodGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArIAogIGNvb3JkX2VxdWFsKCkKCgoKYGBgCgojIyBJcyBSU0EgYWJvdmUgMD8KYGBge3IgaXMgUlNBIGFib3ZlIDB9Cgpyc2FfdC50ZXN0IDwtIHQudGVzdChzaW1pbGFyaXR5X2RmJHJzYSwgbXUgPSAwKQoKcnNhX3QudGVzdAoKYGBgCgojIyBSU0Egc2NvcmVzIGJ5IGFnZQpgYGB7ciBhbmFseXplIHNpbWlsYXJpdHkgYnkgYWdlfQoKI3NjYWxlIGFnZQpzaW1pbGFyaXR5X2RmJGFnZV96IDwtIHNjYWxlX3RoaXMoc2ltaWxhcml0eV9kZiRhZ2UpCgojcnVuIG1vZGVsCnNpbWlsYXJpdHlfbW9kZWwgPC0gbG0ocnNhIH4gYWdlX3osIGRhdGEgPSBzaW1pbGFyaXR5X2RmKQphbm92YShzaW1pbGFyaXR5X21vZGVsKQpgYGAKCmBgYHtyIGFuYWx5emUgc2ltaWxhcml0eSBieSBxdWFkcmF0aWMgYWdlfQoKI3NjYWxlIGFnZQpzaW1pbGFyaXR5X2RmJGFnZV9zcXVhcmVkX3ogPC0gc2NhbGVfdGhpcyhzaW1pbGFyaXR5X2RmJGFnZV4yKQoKI3J1biBtb2RlbApzaW1pbGFyaXR5X21vZGVsX2FnZV9zcXVhcmVkIDwtIGxtKHJzYSB+IChhZ2VfeiArIGFnZV9zcXVhcmVkX3opLCBkYXRhID0gc2ltaWxhcml0eV9kZikKc3VtbWFyeShzaW1pbGFyaXR5X21vZGVsX2FnZV9zcXVhcmVkKQoKI2NvbXBhcmUgbW9kZWxzCmFub3ZhKHNpbWlsYXJpdHlfbW9kZWwsIHNpbWlsYXJpdHlfbW9kZWxfYWdlX3NxdWFyZWQpCmBgYAoKCmBgYHtyIHBsb3QgUlNBIGJ5IGFnZX0KCnJzYV9hZ2VfcGxvdCA8LSBnZ3Bsb3Qoc2ltaWxhcml0eV9kZiwgYWVzKHggPSBhZ2UsIHkgPSByc2EpKSArCiAgICBnZW9tX3BvaW50KGNvbG9yID0gcGxvdF9jb2xvcnNbNV0pICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIikgKwogIHhsYWIoIkFnZSIpICsgCiAgeWxhYigiUmVwcmVzZW50YXRpb25hbCBTaW1pbGFyaXR5IChSU0EpIikgKwogIGdyYXBoX3RoZW1lKCkKcnNhX2FnZV9wbG90CmBgYAoKCiMgTW9kZWwtZGVyaXZlZCBwYXJhbWV0ZXIgYW5hbHlzZXMKCmBgYHtyIHJlYWQgaW4ganVsaWEgbW9kZWxpbmcgcmVzdWx0c30KCiNyZWFkIGluIG1vZGVsaW5nIHJlc3VsdHMKbW9kZWxfcmVzdWx0cyA8LSByZWFkX2NzdigiZGF0YS9wcm9jZXNzZWQvbW9kZWxfaW5kaXZpZF9wYXJhbXMuY3N2IikgJT4lCiAgcmVuYW1lKM6yX0MgPSDOsl9hbnRpY2lwYXRpb24sCiAgICAgICAgzrJfUiA9IM6yX3plcm9fb3JkZXIpCgojY29tYmluZSB3aXRoIGFnZQptb2RlbF9yZXN1bHRzIDwtIGlubmVyX2pvaW4obW9kZWxfcmVzdWx0cywgYWdlX2RhdGEsIGJ5ID0gYygic3ViamVjdF9pZCIpKQpgYGAKCiMjIFJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYW5kIGFnZQojIyMgUGxvdDogUmVsYXRpb24gYmV0d2VlbiDOsl9DIGFuZCBhZ2UKCmBgYHtyIGJldGEgYyBhZ2UgcGxvdCwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDV9CgojcGxvdCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGFnZSBhbmQgYmV0YV9hbnRpY2lwYXRpb24KZ2dwbG90KG1vZGVsX3Jlc3VsdHMsIGFlcyh4ID0gYWdlLCB5ID0gzrJfQykpICsKICBnZW9tX3BvaW50KGNvbG9yID0gcGxvdF9jb2xvcnNbNV0pICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICdibGFjaycpICsKICB4bGFiKCJBZ2UiKSArCiAgeWxhYihleHByZXNzaW9uKGJldGFbQ10pKSArCiAgZ3JhcGhfdGhlbWUoKQpgYGAKCiMjIyBQbG90OiBSZWxhdGlvbiBiZXR3ZWVuIM6yX1IgYW5kIGFnZQoKYGBge3IgYmV0YSByIGFnZSBwbG90LCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNX0KCmdncGxvdChtb2RlbF9yZXN1bHRzLCBhZXMoeCA9IGFnZSwgeSA9IM6yX1IpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9IHBsb3RfY29sb3JzWzVdKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siKSArCiAgeGxhYigiQWdlIikgKwogIHlsYWIoZXhwcmVzc2lvbihiZXRhW1JdKSkgKwogIGdyYXBoX3RoZW1lKCkKYGBgCgoKIyMjIFBsb3Q6IFJlbGF0aW9uIGJldHdlZW4gzrMgYW5kIGFnZQoKYGBge3IgZ2FtbWEgYWdlIHBsb3QsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSA1fQoKZ2dwbG90KG1vZGVsX3Jlc3VsdHMsIGFlcyh4ID0gYWdlLCB5ID0gzrMpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9IHBsb3RfY29sb3JzWzVdKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siKSArCiAgeGxhYigiQWdlIikgKwogIHlsYWIoZXhwcmVzc2lvbihnYW1tYSkpICsKICBncmFwaF90aGVtZSgpCgoKYGBgCgoKIyMjIFBsb3Q6IFJlbGF0aW9uIGJldHdlZW4gzrJfQyBhbmQgzrJfUgoKYGBge3IgYmV0YSBjIGJldGEgciBwbG90LCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNX0KCiNwbG90IGNvcnJlbGF0aW9uIGJldHdlZW4gYmV0YV9SIGFuZCBiZXRhX0MKZ2dwbG90KG1vZGVsX3Jlc3VsdHMsIGFlcyh4ID0gzrJfUiwgeSA9IM6yX0MpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9IHBsb3RfY29sb3JzWzVdKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAnYmxhY2snKSArCiAgeGxhYihleHByZXNzaW9uKGJldGFbUl0pKSArCiAgeWxhYihleHByZXNzaW9uKGJldGFbQ10pKSArCiAgZ3JhcGhfdGhlbWUoKQpgYGAKCiMjIFJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYW5kIGV4cGxpY2l0IGtub3dsZWRnZQoKIyMjIFJlbGF0aW9uIGJldHdlZW4gzrJfQyBhbmQgZ3JhcGggcmVjb25zdHJ1Y3Rpb24KYGBge3IgbW9kZWwgcmVsYXRpb24gYmV0d2VlbiBiZXRhX2MgYW5kIHJzYX0KCiNqb2luIHdpdGggZGlzdCBwcm9wCmRhdGEgPC0gaW5uZXJfam9pbihtb2RlbF9yZXN1bHRzLCBzaW1pbGFyaXR5X2RmLCBieSA9IGMoInN1YmplY3RfaWQiLCAiYWdlIikpCgojei1zY29yZSB2YXJpYWJsZXMKZGF0YSRhZ2VfeiA8LSBzY2FsZV90aGlzKGRhdGEkYWdlKQpkYXRhJGJldGFfY196IDwtIHNjYWxlX3RoaXMoZGF0YSTOsl9DKQoKI3J1biBtb2RlbApiZXRhX2NfcnNhX21vZGVsIDwtIGxtKHJzYSB+IGJldGFfY196LCBkYXRhID0gZGF0YSkKc3VtbWFyeShiZXRhX2NfcnNhX21vZGVsKQoKIyBubyBzaWduaWZpY2FudCBlZmZlY3RzCiMgYWxzbyBubyBzaWduaWZpY2FudCBlZmZlY3RzIHd0aWggYWdlIGluIG1vZGVsCmBgYAoKCiMjIyBSZWxhdGlvbiBiZXR3ZWVuIM6zIGFuZCBncmFwaCByZWNvbnN0cnVjdGlvbgpgYGB7ciBtb2RlbCByZWxhdGlvbiBiZXR3ZWVuIGdhbW1hIGFuZCByc2F9Cgojei1zY29yZSB2YXJpYWJsZXMKZGF0YSRnYW1tYV96IDwtIHNjYWxlX3RoaXMoZGF0YSTOsykKCiNydW4gbW9kZWwKZ2FtbWFfcnNhX21vZGVsIDwtIGxtKHJzYSB+IGdhbW1hX3osIGRhdGEgPSBkYXRhKQpzdW1tYXJ5KGdhbW1hX3JzYV9tb2RlbCkKCiNubyBlZmZlY3QKI2Fsc28gbm8gZWZmZWN0IHdpdGggYWdlCmBgYAoKCiMjIyBSZWxhdGlvbiBiZXR3ZWVuIM6yX1IgYW5kIHJzYQpgYGB7ciBtb2RlbCByZWxhdGlvbiBiZXR3ZWVuIGJldGFSIGFuZCByc2F9Cgojei1zY29yZSB2YXJpYWJsZXMKZGF0YSRiZXRhX3JfeiA8LSBzY2FsZV90aGlzKGRhdGEkzrJfUikKCiNydW4gbW9kZWwKYmV0YV9yX3JzYV9tb2RlbCA8LSBsbShyc2EgfiAgYmV0YV9yX3osIGRhdGEgPSBkYXRhKQpzdW1tYXJ5KGJldGFfcl9yc2FfbW9kZWwpCgojIG5vIHJlbGF0aW9uCmBgYAoKCgoKIyMjIFJlbGF0aW9uIGJldHdlZW4gzrJfQyBhbmQgcGFyc2luZwpgYGB7ciBwYXJzaW5nIG1vZGVsIHBhcmFtIGRhdGEgcHJvY2Vzc2luZ30KCiNzZWxlY3QgbW9kZWwgcmVzdWx0cwptb2RlbF9yZXN1bHRzX3NlbGVjdCA8LSBtb2RlbF9yZXN1bHRzICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdF9pZCwgzrJfQywgzrJfUiwgzrMpCgojam9pbiBtb2RlbCByZXN1bHRzIHdpdGggcGFyc2luZyBtb2RlbCBkYXRhCm1vZGVsX3Jlc3VsdHNfc2VsZWN0JHN1YmplY3RfaWQgPC0gYXMuZmFjdG9yKG1vZGVsX3Jlc3VsdHNfc2VsZWN0JHN1YmplY3RfaWQpCnBhcnNpbmdfcGxhbmV0X3JlY2VuY3lfZGF0YSRzdWJqZWN0X2lkIDwtIGFzLmZhY3RvcihwYXJzaW5nX3BsYW5ldF9yZWNlbmN5X2RhdGEkc3ViamVjdF9pZCkKcGFyc2luZ19wYXJhbWV0ZXJfbWl4ZWRfbW9kZWxfZGF0YSA8LSBpbm5lcl9qb2luKG1vZGVsX3Jlc3VsdHNfc2VsZWN0LCBwYXJzaW5nX3BsYW5ldF9yZWNlbmN5X2RhdGEsIGJ5ID0gYygic3ViamVjdF9pZCIpKQoKYGBgCgpgYGB7ciBwYXJzaW5nIGFuZCBiZXRhIGN9Cgojei1zY29yZSB2YXJpYWJsZXMKcGFyc2luZ19wYXJhbWV0ZXJfbWl4ZWRfbW9kZWxfZGF0YSRhZ2VfeiA8LSBzY2FsZV90aGlzKHBhcnNpbmdfcGFyYW1ldGVyX21peGVkX21vZGVsX2RhdGEkYWdlKQpwYXJzaW5nX3BhcmFtZXRlcl9taXhlZF9tb2RlbF9kYXRhJGJldGFfY196IDwtIHNjYWxlX3RoaXMocGFyc2luZ19wYXJhbWV0ZXJfbWl4ZWRfbW9kZWxfZGF0YSTOsl9DKQpwYXJzaW5nX3BhcmFtZXRlcl9taXhlZF9tb2RlbF9kYXRhJHdpdGhpbl9ibG9ja190cmlhbF96IDwtIHNjYWxlX3RoaXMocGFyc2luZ19wYXJhbWV0ZXJfbWl4ZWRfbW9kZWxfZGF0YSR3aXRoaW5fYmxvY2tfdHJpYWwpCnBhcnNpbmdfcGFyYW1ldGVyX21peGVkX21vZGVsX2RhdGEkdHJhbnNpdGlvbl90eXBlIDwtIGZhY3RvcihwYXJzaW5nX3BhcmFtZXRlcl9taXhlZF9tb2RlbF9kYXRhJHRyYW5zaXRpb25fdHlwZSkKcGFyc2luZ19wYXJhbWV0ZXJfbWl4ZWRfbW9kZWxfZGF0YSRwbGFuZXRfbGFnX3ogPC0gc2NhbGVfdGhpcyhwYXJzaW5nX3BhcmFtZXRlcl9taXhlZF9tb2RlbF9kYXRhJHBsYW5ldF9sYWcpCnBhcnNpbmdfcGFyYW1ldGVyX21peGVkX21vZGVsX2RhdGEkYmxvY2tfeiA8LSBzY2FsZV90aGlzKHBhcnNpbmdfcGFyYW1ldGVyX21peGVkX21vZGVsX2RhdGEkYmxvY2tfbnVtYmVyKQoKCiNydW4gcGFyc2luZyBhbmFseXNpcyAtIGRvIGFnZSB4IHRyYW5zaXRpb24gdHlwZSBlZmZlY3RzIGdvIGF3YXkgd2hlbiB5b3UgYWNjb3VudCBmb3IgYmV0YV9jPwpwYXJzaW5nX2JldGFfYyA8LSBtaXhlZChwYXJzZSB+IChhZ2VfeiArIGJldGFfY196KSAqICh0cmFuc2l0aW9uX3R5cGUgKyBwbGFuZXRfbGFnX3ogKyB3aXRoaW5fYmxvY2tfdHJpYWxfeiArIGJsb2NrX3opICsgKHRyYW5zaXRpb25fdHlwZSArIHBsYW5ldF9sYWdfeiArIHdpdGhpbl9ibG9ja190cmlhbF96ICsgYmxvY2tfeiB8fCBzdWJqZWN0X2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzaW5nX3BhcmFtZXRlcl9taXhlZF9tb2RlbF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyPSJib2J5cWEiLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTFlNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3JlID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJMUlQiKQoKcGFyc2luZ19iZXRhX2MKYGBgCgoKIyMjIFJlbGF0aW9uIGJldHdlZW4gzrJfUiBhbmQgcGFyc2luZyAKYGBge3IgcGFyc2luZyBhbmQgYmV0YSByfQoKI3otc2NvcmUgdmFyaWFibGVzCnBhcnNpbmdfcGFyYW1ldGVyX21peGVkX21vZGVsX2RhdGEkYmV0YV9yX3ogPC0gc2NhbGVfdGhpcyhwYXJzaW5nX3BhcmFtZXRlcl9taXhlZF9tb2RlbF9kYXRhJM6yX1IpCgoKI3J1biBwYXJzaW5nIGFuYWx5c2lzIC0gZG8gYWdlIHggdHJhbnNpdGlvbiB0eXBlIGVmZmVjdHMgZ28gYXdheSB3aGVuIHlvdSBhY2NvdW50IGZvciBiZXRhX2M/CnBhcnNpbmdfYmV0YV9yIDwtIG1peGVkKHBhcnNlIH4gKGFnZV96ICsgYmV0YV9yX3opICogKHRyYW5zaXRpb25fdHlwZSArIHBsYW5ldF9sYWdfeiArIHdpdGhpbl9ibG9ja190cmlhbF96ICsgYmxvY2tfeikgKyAodHJhbnNpdGlvbl90eXBlICsgcGxhbmV0X2xhZ196ICsgd2l0aGluX2Jsb2NrX3RyaWFsX3ogKyBibG9ja196IHx8IHN1YmplY3RfaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBhcnNpbmdfcGFyYW1ldGVyX21peGVkX21vZGVsX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsIG9wdEN0cmw9bGlzdChtYXhmdW49MWU2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfcmUgPSBULAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIkxSVCIpCgpwYXJzaW5nX2JldGFfcgoKYGBgCgo=